繁体   English   中英

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

[英]Why does numpy not allow assignment of a doubly indexed numpy array?

我想将数组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 即相当于[FFFFFFTFTF]

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保持不变。 我的问题是,为什么会这样?

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

如果有任何不清楚的地方,请让我知道,我会尽力澄清。

编辑

我对此进行了进一步研究,问题似乎在方程的左侧,类似于

arr_1[selection_a][selection_b] = 5

也不起作用。

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

编辑:布尔索引是所谓的“高级索引”的一部分。 将索引保持为简单片可避免这些复制问题。

如果要获得更改arr_1数组所需的结果,请添加到Pierre de Buyl解决方案中。 您可以使用np.where ,如下所示:

arr_1[selection_a] = np.where(arr_2[selection_a]>5,arr_2[selection_a],arr_1[selection_a])

arr_1

这使

array([-1, -1, -1, -1, -1, -1,  6, -1,  8, -1])

它与python中的=解释为.__setitem__() ,后者可以从分配的变量中选择内存地址。 但是,它不会递归执行此操作,因此

a[boolean_mask] = 0 

的作品,如索引指向内存中a

a[mask1][mask2] = 0

不会,因为索引指向a[mask1]的内存,该内存是副本。

由于selection_aselection_b的条件互不依赖,因此您可以创建一个组合的遮罩

selection_c = (np.arange(10) % 2 == 0) & (arr_2 >  5)

并像这样使用

arr_1[selection_c] = 5

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM