为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

largeQ 2022-06-02 11:10:01
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) 的二维数组。
查看完整描述

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


查看完整回答
反对 回复 2022-06-02
?
摇曳的蔷薇

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)


查看完整回答
反对 回复 2022-06-02
  • 2 回答
  • 0 关注
  • 114 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信