python - 为什么 numpy 不允许分配双重索引的 numpy 数组?

标签 python numpy

我想将数组 arr_2 的值分配给另一个数组 arr_1。但是,我想根据 2 个选择标准来执行此操作。作为一个工作示例,我定义了我的选择标准

import numpy as np

# An array of -1 values of shape(10,): [-1 -1 -1 -1 -1 -1 -1 -1 -1 -1]
arr_1 = np.zeros(10, dtype=int) - 1
# An array of 0-9 values of shape(10,): [0 1 2 3 4 5 6 7 8 9]
arr_2 = np.arange(10)

# Create an initial selection of values we want to change
# In this example: even indices: [ T F T F T F T F T F]
selection_a = np.arange(10) % 2 == 0

# Create a second selection based on selection_a: [F F F T T]
selection_b = arr_2[selection_a] > 5

基于这两个选择标准,我想将满足两个条件的 arr_2 的值分配给数组 arr_1。 IE。相当于 [F F F F F F T F T F]

arr_1[selection_a][selection_b] = arr_2[selection_a][selection_b]

如果我在赋值之前检查等式的两边,它们会产生我期望的值:

print(arr_1[selection_a][selection_b]) # yields [-1 -1]
print(arr_2[selection_a][selection_b]) # yields [ 6, 8]

但是,赋值本身并不赋值,即 arr_1 保持不变。我的问题是,为什么会这样?

注意:我知道在大多数情况下(甚至可能在所有情况下)这可以通过创建一个单一标准来规避,但我想知道为什么使用 2 个单独的标准不起作用。

如果有任何不清楚的地方,请告诉我,我会尽力澄清。

编辑

我对此进行了进一步调查,问题似乎出在等式的左侧

arr_1[selection_a][selection_b] = 5

也不行。

最佳答案

[...] 运算符的一次使用在数组中创建一个选择,您可以从中读取和写入。第二次使用 [...] 将毫无问题地读取值。但就写入而言,第二次访问将访问为匹配选择规则而创建的临时数组(即形状为 (2,) 的临时数组,它是原始数据的副本)你的情况。

编辑: bool 索引是所谓的“高级索引”的一部分。保持对简单切片的索引避免了这些复制问题。

关于python - 为什么 numpy 不允许分配双重索引的 numpy 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52383664/

相关文章:

python - 将两个数据框与原点合并

Python面向对象模型

python - pickle numpy数组的子类时保留自定义属性

python - 如何用代码更改Mayavi中的字体类型和大小?

python - Cython:(为什么/何时)最好使用 Py_ssize_t 进行索引?

python - 尝试使用 astropy 将 FITS 文件转换为 ndarray 时获取 NaN 值

python - 基准测试 Django 应用程序

python - 用 Pandas .replace 替换列数据不起作用

python - 在 sklearn 中尝试交叉验证时出现类型错误

python - 矢量化 : too many indices for array