bra*_*d14 5 python arrays numpy structure
我刚开始使用numpy数组而且我在创建结构化数组时遇到了麻烦.我想创建类似于Matlab结构的东西,其中字段可以是不同形状的数组.
a=numpy.array([1, 2, 3, 4, 5, 6,]);
b=numpy.array([7,8,9]);
c=numpy.array([10,11,12,13,14,15,16,17,18,19,20]);
##Doesn't do what I want
data=numpy.array([a, b, c],dtype=[('a','f8'),('b','f8'),('c','f8')]);
Run Code Online (Sandbox Code Playgroud)
我想data['a']
返回矩阵a,data['b']
返回矩阵b等.当在Matlab结构中读取时,数据以这种格式保存,所以我知道它必须是可能的.
Pie*_* GM 13
我担心如果不扭动NumPy的手臂就不可能.
看,NumPy背后的想法是提供同类数组,即所有具有相同类型的元素数组.这种类型可以很简单(int
,float
...)或更复杂([('',int),('',float),('',"|S10")])
但在任何情况下,所有元素都具有相同的类型.这允许一些非常有效的内存布局.
因此,固有地,结构化数组要求字段(各个子块)具有相同的大小,无论位置如何.检查以下内容:
>>> np.zeros(3,dtype=[('a',(int,3)),('b',(float,5))])
Run Code Online (Sandbox Code Playgroud)
它定义了一个包含三个元素的数组; 每个元素由两个子块组成,a
并且b
; a
是一个三块ints
,b
一块五块floats
.但是一旦你定义了块中的块的初始大小dtype
,你就会坚持下去(好吧,你总是可以切换,但这是另一个故事).
有一个解决方法:使用dtype=object
.这样,您就构建了一个异构项目数组,就像一系列不同大小的列表一样.但是你失去了很多NumPy的力量.还是一个例子:
>>> x=np.zeros(3, dtype=[('a',object), ('b',object)])
>>> x['a'][0] = [1,2,3,4]
>>> x['b'][-1] = "ABCDEF"
>>> print x
[([1, 2, 3, 4], 0) (0, 0) (0, 'ABCD')]
Run Code Online (Sandbox Code Playgroud)
所以,我们刚刚构造了一个......对象数组.我在某处放了一个列表,在其他地方放了一个字符串,它有效.您可以按照相同的示例来构建您想要的数组:
blob = np.array([(a,b,c)],dtype=[('a',object),('b',object),('c',object)])
Run Code Online (Sandbox Code Playgroud)
但是,你应该再三思考它是否真的是你的结果,另一个结构可能会更有效率.
附注:请注意[(a,b,c)]
上面表达的部分:注意()
?你基本上告诉NumPy构造一个由3个子元素组成的1个元素的数组(每个元素对应一个a,b,c
),每个子元素都是一个对象.如果你不放()
,NumPy会抱怨很多.
而最后的评论:如果你访问你的领域,如blob['a']
,你会得到相同大小的数组(1,)
和dtype=object
:只要使用blob['a'].item()
找回原来的(6,)
int
阵列.
在python中,字典大致类似于Matlab中的结构.您可以尝试以下操作以查看它是否适合您:
>>> data = {'a':a, 'b':b, 'c':c}
>>> data['a'] is a
True
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
9726 次 |
最近记录: |