给定一个二维 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]]
最佳答案
Now你知道如何访问你想要的行/列,只需将你想要的值分配给你的子数组。不过,这有点棘手:
mask = rows[:,None]*cols[None,:]
data[mask] = 0
原因是当我们以 data[rows][:,cols]
访问子数组时(如您的 previous question 所示,我们正在查看一个 View ,而一些对原始数据的引用会在途中丢失。
相反,我们在这里通过广播两个一维数组 rows
和 cols
来构造一个二维 bool 数组。您的 mask
数组现在具有形状 (len(rows),len(cols)
。我们可以使用 mask
直接访问原始项目data
,我们将它们设置为一个新值。请注意,当您执行 data[mask]
时,您会得到一个一维数组,这不是您想要的答案previous question .
要构造掩码,我们可以使用 &
运算符而不是 *
(因为我们正在处理 bool 数组),或者更简单的 np.outer
功能:
mask = np.outer(rows,cols)
编辑:@Marcus Jones 的 np.outer
解决方案。
关于python - 使用 bool 索引就地修改 numpy 数组部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12437264/