Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何创建具有多个不同形状字段的numpy结构化数组?_Python_Arrays_Numpy_Structure - Fatal编程技术网

Python 如何创建具有多个不同形状字段的numpy结构化数组?

Python 如何创建具有多个不同形状字段的numpy结构化数组?,python,arrays,numpy,structure,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','f

我刚接触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')]);  

我想
data['a']
返回矩阵a,
data['b']
返回矩阵b等等。在Matlab结构中读取时,数据以这种格式保存,因此我知道这一定是可能的。

如果不经常扭动NumPy的手臂,恐怕是不可能的

看,NumPy背后的思想是提供同构数组,即所有元素都具有相同类型的数组。这种类型可以是简单的(
int
float
…)或更复杂的(
[(“”,int),(“”,float),(“”,“,”,S10”))
,但在任何情况下,所有元素都具有相同的类型。这允许一些非常有效的内存布局

因此,从本质上讲,结构化数组要求字段(各个子块)具有相同的大小,无论位置如何。检查以下各项:

>>> np.zeros(3,dtype=[('a',(int,3)),('b',(float,5))])
它定义了一个包含三个元素的数组;每个元素由两个子块组成,
a
b
<代码>a是一个由三个
整数组成的块,
b
是一个由五个
浮点组成的块
。但是,一旦您在
dtype
中定义了块的初始大小,您就会被卡住(当然,您可以随时切换,但这是另一回事)

有一种解决方法:使用
dtype=object
。这样,您就构建了一个异构项数组,就像一个不同大小的列表数组。但是那样你会失去很多力量。不过,举个例子:

>>> 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个元素组成的数组,由三个子元素组成(分别对应于
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

谢谢,这正是我想要的。我想我试图通过一个numpy数组来实现这一点是错误的。在我的例子中,我试图将多个不同形状的数组保存到一个文件中
numpy.savez
为我解决了这个问题,因为它允许保存多个数组
np.savez('data.npz',a=a,b=b,c=c)