2 回答
TA贡献1877条经验 获得超1个赞
In [30]: a = np.array([[(1, 2, 3), 40, 50], [(4, 5, 6), 70, 80]])
看a:
In [31]: a
Out[31]:
array([[(1, 2, 3), 40, 50],
[(4, 5, 6), 70, 80]], dtype=object)
In [32]: a.shape
Out[32]: (2, 3)
第一列 - 2 个项目,两个元组
In [33]: a[:,0]
Out[33]: array([(1, 2, 3), (4, 5, 6)], dtype=object)
它们可以通过以下方式连接成一个二维数组:
In [34]: np.stack(_)
Out[34]:
array([[1, 2, 3],
[4, 5, 6]])
最后两个数组的结构完全不同。一个有 2 个元素,引用内存中其他位置的元组。另一个有 6 个元素,数字,而不是参考,具有 2d 形状和步幅。
这是不同的:
In [35]: np.array([(1, 2, 3), (4, 5, 6)])
Out[35]:
array([[1, 2, 3],
[4, 5, 6]])
它从元组列表构造一个数组。 Out[33]从现有数组(使用 object dtype)构造一个数组。
TA贡献1793条经验 获得超6个赞
如果所有行都具有相同的结构,您可以获得接近您想要的行为:
a = np.array([((1, 2, 3), 40, 50), ((4, 5, 6), 70, 80)], dtype=("(3,)i,i,i"))
请注意,您必须设置一个复合 dtype 来指示行结构,并且您必须对初始化程序中的行使用元组。结果数组看起来像
a
# array([([1, 2, 3], 40, 50), ([4, 5, 6], 70, 80)],
# dtype=[('f0', '<i4', (3,)), ('f1', '<i4'), ('f2', '<i4')])
您可以通过字段名称访问感兴趣的位
a['f0']
# array([[1, 2, 3],
# [4, 5, 6]], dtype=int32)
a['f0'].shape
# (2, 3)
添加回答
举报