给定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]]
答案 0 :(得分:7)
Now您知道如何访问所需的行/列,只需将您想要的值分配给子阵列。但是,这有点棘手:
mask = rows[:,None]*cols[None,:]
data[mask] = 0
原因是当我们以data[rows][:,cols]
的形式访问子数据时(如previous question所示),我们正在查看视图,并且对原始数据的一些引用会在方式。
相反,在这里我们通过将两个1D数组rows
和cols
一个广播到另一个来构建一个2D布尔数组。您的mask
数组现在的形状为(len(rows),len(cols)
。我们可以使用mask
直接访问data
的原始项,然后将它们设置为新值。请注意,当您执行data[mask]
时,您会获得一维数组,这不是您在previous question中想要的答案。
要构造掩码,我们可以使用&
运算符而不是*
(因为我们处理的是布尔数组)或更简单的np.outer
函数:
mask = np.outer(rows,cols)
编辑:为np.outer
解决方案向@Marcus Jones提供道具。