Python 用链式遮罩替换numpy数组元素
考虑一些数组Python 用链式遮罩替换numpy数组元素,python,numpy,numpy-ndarray,numpy-slicing,Python,Numpy,Numpy Ndarray,Numpy Slicing,考虑一些数组arr和高级索引掩码mask: import numpy as np arr = np.arange(4).reshape(2, 2) mask = A < 2 我有两个相关的问题: 1/使用链式遮罩替换阵列元素的最佳方法是什么 2/如果advanced indexing返回数组的副本,为什么下面的操作会起作用 arr[mask] = -1 print(arr) [[-1 -1] [ 2 3]] 几个好问题!我的看法: 我会这样做: 从: 以下大多数示例显示了在引用
arr
和高级索引掩码mask
:
import numpy as np
arr = np.arange(4).reshape(2, 2)
mask = A < 2
我有两个相关的问题:
1/使用链式遮罩替换阵列元素的最佳方法是什么
2/如果advanced indexing返回数组的副本,为什么下面的操作会起作用
arr[mask] = -1
print(arr)
[[-1 -1]
[ 2 3]]
几个好问题!我的看法:
arr[mask]=1
是引用,而arr[mask]
是提取数据并创建副本。简短回答:
- 你必须想出一种组合面具的方法。由于面具可以以不同的方式“连锁”,我认为没有简单的通用替代品
- 索引可以是
调用,也可以是\uuuuu getitem\uuuuuu
。你的最后一个箱子是一套\uuuuuuuu setitem\uuuuu
a[mask1][mask2]=value
被转换为
a.__getitem__(mask1).__setitem__(mask2, value)
a
是否被修改取决于第一个getitem生成的内容(视图与副本)
或掩码的逻辑组合:
In [26]: (np.arange(4).reshape(2,2)<2)&[False,True]
Out[26]:
array([[False, True],
[False, False]])
在[26]:(np.arange(4).重塑(2,2)我接受这一点是出于一般性,但请参阅另一个答案,以获得如何在某些情况下连锁面具的灵感。我为您的第一个示例添加了一种可能性。
a.__getitem__(mask1).__setitem__(mask2, value)
In [11]: arr = np.arange(4).reshape(2,2)
In [12]: mask = arr<2
In [13]: mask
Out[13]:
array([[ True, True],
[False, False]])
In [14]: arr[mask]
Out[14]: array([0, 1])
In [15]: mask[:,0]=False
In [16]: mask
Out[16]:
array([[False, True],
[False, False]])
In [17]: arr[mask]
Out[17]: array([1])
In [18]: arr[mask] += 10
In [19]: arr
Out[19]:
array([[ 0, 11],
[ 2, 3]])
In [26]: (np.arange(4).reshape(2,2)<2)&[False,True]
Out[26]:
array([[False, True],
[False, False]])