Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么numpy不允许分配双索引numpy数组?_Python_Numpy - Fatal编程技术网

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

Python 为什么numpy不允许分配双索引numpy数组?,python,numpy,Python,Numpy,我想将数组arr\u 2的值分配给不同的数组arr\u 1。然而,我想根据两个选择标准来做这件事。作为一个工作示例,我定义了我的选择标准 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

我想将数组
arr\u 2
的值分配给不同的数组
arr\u 1
。然而,我想根据两个选择标准来做这件事。作为一个工作示例,我定义了我的选择标准

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
。即相当于
[F F 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
保持不变。我的问题是,为什么会这样

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

如果有什么不清楚的地方,请告诉我,我会尽力澄清

编辑 我对此进行了进一步的研究,问题似乎出现在等式的左侧

arr_1[selection_a][selection_b] = 5

也不起作用。

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


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

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


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

如果您希望获得更改
arr\u 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])

如果您希望获得更改
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中的
=
被解释为
\uuuuu setitem\uuuuuu()
有关,它可以从指定的变量中选择内存地址。但是,它不会递归地执行此操作

a[boolean_mask] = 0 
工作,因为索引指向
a
中的内存

a[mask1][mask2] = 0

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

它与python中的
=
被解释为
\uuuuuu setitem\uuuuuuuuu()
有关,它可以从分配的变量中选择内存地址。但是,它不会递归地执行此操作

a[boolean_mask] = 0 
工作,因为索引指向
a
中的内存

a[mask1][mask2] = 0

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

由于
选择a
选择b
的条件互不依赖,您可以创建一个组合掩码

selection_c = (np.arange(10) % 2 == 0) & (arr_2 >  5)
像这样使用它

arr_1[selection_c] = 5

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

selection_c = (np.arange(10) % 2 == 0) & (arr_2 >  5)
像这样使用它

arr_1[selection_c] = 5

我会这样做:
idx=arr_2[selection_a][selection_b];arr_1[idx]=idx
定义
selection_b
arr_2>5和selection_a
然后使用
arr_1[selection_b]=5
@GiacomoAlzetta
selection_a
selection_b
具有不同的形状。@PM2Ring。我想说的是:与其让
selection\u b
依赖于
selection\u a
中需要嵌套选择的结果,只需将其定义为与
selection\u a
相同的形状,并使用
&
进行“筛选”。您始终可以将嵌套条件
[a][b][c][d]
重写为
[a&b'&c'&d']
,其中预处理版本
b'
c'
d'
(ecc.)的形状与
a
相同。关键是
arr\u 1[selection\u a]
副本,而不是
视图。作业是修改该副本的一部分,而不是原件的一部分
numpy
未同时解析这两个条件。Python正在执行两个独立的索引操作;arr_1[idx]=idx
定义
selection_b
arr_2>5和selection_a
然后使用
arr_1[selection_b]=5
@GiacomoAlzetta
selection_a
selection_b
具有不同的形状。@PM2Ring。我想说的是:与其让
selection\u b
依赖于
selection\u a
中需要嵌套选择的结果,只需将其定义为与
selection\u a
相同的形状,并使用
&
进行“筛选”。您始终可以将嵌套条件
[a][b][c][d]
重写为
[a&b'&c'&d']
,其中预处理版本
b'
c'
d'
(ecc.)的形状与
a
相同。关键是
arr\u 1[selection\u a]
副本,而不是
视图。作业是修改该副本的一部分,而不是原件的一部分
numpy
未同时解析这两个条件。派特