给定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)
既然您知道如何访问所需的行/列,只需将您想要的值分配给子阵列即可.但这有点棘手:
mask = rows[:,None]*cols[None,:]
data[mask] = 0
Run Code Online (Sandbox Code Playgroud)
原因是当我们访问子阵列时data[rows][:,cols]
(如前一个问题中所示,我们正在查看视图,并且对原始数据的一些引用会丢失.
相反,在这里我们通过广播你的两个一维数组rows
和cols
一个与另一个一起构建一个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
解决方案的道具.
归档时间: |
|
查看次数: |
2397 次 |
最近记录: |