恐怕没有扭曲NumPy的手臂是不可能的。
看到,NumPy背后的想法是提供同类数组,即所有元素都具有相同类型的数组。此类型可以是简单的(int
,float
...)或更复杂的([('',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
阵列。
谢谢,这正是我所期待的。我想我是在错误的轨道上试图通过一个numpy数组来做到这一点。 – brad14