猿问

numpy 是否以一种奇怪的方式处理一维数组切片?

import numpy as np
a = np.array([[(1, 2, 3), 40, 50], [(4, 5, 6), 70, 80]])

仅使用 numpy 操作(即,没有明确的 python 样式列表构造或循环;如果可能,目标是节省时间),我如何创建一个 2×3 numpy 数组(矩阵)[[1,2,3 ], [4,5,6]] 来自上述数组 a?

切片 a[:, 0] 产生一个形状为 (2,) 的一维数组,打印为 [(1,2,3) (4,5,6)],显然不能“重塑”形状(2, 3)。我认为在 a[:, 0] 上执行 np.ravel 然后重塑为 (2,3) 可能会为我解决这个问题,但不幸的是 a[:, 0] 上的 np.ravel 不会产生任何变化,因为 a[:, 0 ] 已经是一维的了。

numpy 不将元组 (1, 2, 3) 和 (4, 5, 6) 等切片中的元组 (1, 2, 3) 和 (4, 5, 6) 的括号视为行的指示,这是 numpy 中的一个已知异常/错误吗? ? 因为,正如我们所知,np.array([(1, 2, 3), (4, 5, 6)]) 产生一个形状为 (2,3) 的二维数组。


largeQ
浏览 115回答 2
2回答

冉冉说

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)构造一个数组。

摇曳的蔷薇

如果所有行都具有相同的结构,您可以获得接近您想要的行为: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)],#&nbsp; &nbsp; &nbsp; &nbsp;dtype=[('f0', '<i4', (3,)), ('f1', '<i4'), ('f2', '<i4')])您可以通过字段名称访问感兴趣的位a['f0']# array([[1, 2, 3],#&nbsp; &nbsp; &nbsp; &nbsp; [4, 5, 6]], dtype=int32)a['f0'].shape# (2, 3)
随时随地看视频慕课网APP

相关分类

Python
我要回答