12

给定一个 2D numpy 数组,即;

import numpy as np

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

我需要根据所需行和列的两个掩码向量修改一个子数组;

rows = np.array([False, False, True, True], dtype=bool)
cols = np.array([True, True, False], dtype=bool)

这样,即;

print data

 #[[11,12,13],
 # [21,22,23],
 # [0,0,33],
 # [0,0,43]]      
4

1 回答 1

10

既然您知道如何访问所需的行/列,只需将所需的值分配给子数组即可。不过,这有点棘手:

mask = rows[:,None]*cols[None,:]
data[mask] = 0

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

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

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

mask = np.outer(rows,cols)

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

于 2012-09-15T12:16:36.883 回答