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]])