命名数组中numpy高级切片的意外行为

2024-04-19 21:06:52 发布

您现在位置:Python中文网/ 问答频道 /正文

使用numpy命名数组时,我观察到以下两种情况下的不同行为:

  1. 案例:首先使用索引数组进行高级切片,然后按名称选择子数组
  2. 案例:首先按名称选择子数组,然后使用索引数组进行高级切片

下面的代码给出了一个示例

import numpy as np

a = np.ones(5)
data = np.array(zip(a, a, a), dtype=[("x", float), ("y", float), ("z", float)])

# case 1
# does not set elements 1, 3 and 4 of data to 22
data[[1, 3, 4]]["y"] = 22    
print data["y"]  # -> [ 1.  1.  1.  1.  1.]

# case 2
# set elements 1, 3 and 4 of data to 22
data["y"][[1, 3, 4]] = 22
print data["y"]  # -> [  1.  22.   1.  22.  22.]

两个打印命令的输出为 [ 1. 1111.]和[1。2212222.]. 为什么在设置元素时更改选择顺序会导致不同的结果?你知道吗


Tags: andoftonumpy名称datanp切片
1条回答
网友
1楼 · 发布于 2024-04-19 21:06:52

使用列表或数组always returns a copy rather than a view索引:

In [1]: np.may_share_memory(data, data[[1, 3, 4]])
Out[1]: False

因此赋值data[[1, 3, 4]]["y"] = 22是修改data[[1, 3, 4]]副本,而data中的原始值将不受影响。你知道吗

另一方面,引用结构化数组returns a view的字段:

In [2]: np.may_share_memory(data, data["y"])
Out[2]: True

因此给data["y"][[1, 3, 4]]赋值将影响data中相应的元素。你知道吗

相关问题 更多 >