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

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

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

最佳答案

如果不大量扭动 NumPy 的 ARM ,恐怕是不可能的。

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

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

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

它定义了一个包含三个元素的数组;每个元素由两个子 block 组成,aba 是三个 int 的 block ,b 是五个 float 的 block 。但是,一旦您在 dtype 中定义了 block 的初始大小,您就会陷入困境(好吧,您可以随时切换,但那是另一回事了)。 p>

有一个解决方法:使用 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 个元素的数组,该数组由三个子元素组成(每个子元素对应一个 a,b,c),每个子元素都是一个对象。如果你不输入 (),NumPy 会提示很多。

还有最后一条评论:如果您访问像 blob['a'] 这样的字段,您将得到一个大小为 (1,)dtype=object:只需使用 blob['a'].item() 即可取回原始的 (6,) int数组。

关于python - 如何创建具有多个不同形状字段的 numpy 结构化数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12377722/

相关文章:

python - QDate 到 QString

python - 收到 'can' t 用 python 包在 '__main__' 中找到 '<packageName>' 模块

python - 为什么 MFCC 提取库返回不同的值?

c - 在 C 中试验指针和数组

c# - byte[] 数组大小等于 C# 中数组的实际大小?

python - 从列表理解和一般情况下有效地创建 numpy 数组

python - 为 PySpark 捆绑 Python3 包导致缺少导入

python - 为什么我在安装 pip 包时没有删除六个的权限?

c - 分配给给定头数组时出现不兼容指针类型警告初始化

Python——Pandas 找不到文件,但 numpy 可以