4

使用 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. 1. 1. 1. 1.] 和 [1. 22. 1. 22. 22.]。为什么在设置元素时更改选择的顺序会导致不同的结果?

4

1 回答 1

3

使用列表或数组进行索引总是返回副本而不是视图

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

因此,赋值data[[1, 3, 4]]["y"] = 22正在修改 的副本data[[1, 3, 4]]而 in 的原始值data将不受影响。

另一方面,引用结构化数组的字段会返回一个视图

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

所以分配 todata["y"][[1, 3, 4]] 影响data.

于 2016-09-29T15:48:50.160 回答