使用布尔索引就地修改numpy数组部分

Mar*_*nes 9 python numpy

给定2D numpy数组,即;

import numpy as np

data = np.array([
     [11,12,13],
     [21,22,23],
     [31,32,33],
     [41,42,43],         
     ])
Run Code Online (Sandbox Code Playgroud)

我需要根据所需行和列的两个屏蔽向量就地修改子数组;

rows = np.array([False, False, True, True], dtype=bool)
cols = np.array([True, True, False], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

这样即;

print data

 #[[11,12,13],
 # [21,22,23],
 # [0,0,33],
 # [0,0,43]]      
Run Code Online (Sandbox Code Playgroud)

Pie*_* GM 7

既然您知道如何访问所需的行/列,只需将您想要的值分配给子阵列即可.但这有点棘手:

mask = rows[:,None]*cols[None,:]
data[mask] = 0
Run Code Online (Sandbox Code Playgroud)

原因是当我们访问子阵列时data[rows][:,cols](如前一个问题中所示,我们正在查看视图,并且对原始数据的一些引用会丢失.

相反,在这里我们通过广播你的两个一维数组rowscols一个与另一个一起构建一个2D布尔数组.你的mask阵列现在有了形状(len(rows),len(cols).我们可以使用mask直接访问原始项目data,并将它们设置为新值.请注意,当您这样做时data[mask],您将获得一维数组,这不是您在上一个问题中想要的答案.

要构造掩码,我们可以使用&运算符代替*(因为我们处理的是布尔数组)或更简单的np.outer函数:

mask = np.outer(rows,cols)
Run Code Online (Sandbox Code Playgroud)

编辑:为@Marcus Jones提供np.outer解决方案的道具.

  • 有没有办法从布尔索引获取视图?上面的工作只是因为numpy以不同的方式对待赋值.`data [mask]`仍然不是一个视图. (2认同)