2012-09-11 28 views
3

我是新来的numpy数组,我无法创建结构化数组。我想创建类似于Matlab结构的东西,其中字段可以是不同形状的数组。如何创建具有不同形状的多个字段的numpy结构数组?

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')]); 

我想data['a']返回矩阵,data['b']返回矩阵B等。当在Matlab的结构读取,数据被以这种格式保存,所以我知道它必须是可行的。

回答

6

在Python中,字典大致类似于Matlab中的结构。你可以尝试下面看看它是否适用于你:

>>> data = {'a':a, 'b':b, 'c':c} 
>>> data['a'] is a 
True 
+0

谢谢,这正是我所期待的。我想我是在错误的轨道上试图通过一个numpy数组来做到这一点。 – brad14

12

恐怕没有扭曲NumPy的手臂是不可能的。

看到,NumPy背后的想法是提供同类数组,即所有元素都具有相同类型的数组。此类型可以是简单的(intfloat ...)或更复杂的([('',int),('',float),('',"|S10")]),但在任何情况下,所有的元素具有相同的类型,即允许一些非常有效的内存布局。

所以,本质上,结构化阵列需要的字段(各子数据块),以具有相同的大小,不管位置检查以下:

>>> np.zeros(3,dtype=[('a',(int,3)),('b',(float,5))]) 

它定义具有三个元素的阵列;每个元件由两个子块,a的和b; a是三块ints,b一个5块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')] 

所以,我们只是构造了一个...对象的数组。我在某处放了一个列表,其他地方放了一个字符串,它可以工作。你可以按照同样的例子建立一个数组像你想:

blob = np.array([(a,b,c)],dtype=[('a',object),('b',object),('c',object)]) 

但之后,你应该三思而后行是否真的是一个平均到最终,另一个结构可能会更有效。

一面请注意:请注意[(a,b,c)]以上部分表达方式:请注意()?你基本上是告诉NumPy构造一个由1个元素组成的数组,每个子元素都是一个对象,由3个子元素组成(每个元素对应一个a,b,c)。如果你不把(),NumPy会抱怨很多。

和最后评论:如果你访问你的领域,如blob['a'],你会得到大小(1,)dtype=object数组:只使用blob['a'].item()找回原来的(6,)int阵列。

相关问题