我有一个三维布尔数组(布尔掩码数组的二维numpy数组),其中有r
行和c
列。在下面的示例中,阵列形状为(3,6,2);3行6列,其中每列包含2个元素
maskArr = np.array([
[[True, False], [True, True], [True, True], [True, True], [True, True], [True, True]],
[[False, True], [False, True], [True, True], [False, True], [True, True], [True, True]],
[[True, False], [True, True], [True, True], [True, True], [True, True], [True, True]],
])
# If n=2: |<- AND these 2 cols ->|<- AND these 2 cols ->|<- AND these 2 cols ->|
# If n=3: |<----- AND these 3 cols ----->|<----- AND these 3 cols ----->|
我知道我可以使用np.all(maskArr, axis=1)
到and
一起所有每行as in previous answer中的掩码数组,但是我希望以n
列的增量将每行中的布尔数组一起and
因此,如果我们从6列开始,如上所述,并且n=2
,我想对每2列应用np.all
的等价物,得到3列的最终结果,其中:
AND
合并在一起-result[:,0] = np.all(maskArr[:,0:1], axis=1)
AND
合并在一起。-result[:,1] = np.all(maskArr[:,2:3], axis=1)
AND
result[:,2] = np.all(maskArr[:,4:5], axis=1)
有没有办法使用np.all
(或其他矢量化方法)来获得这个结果
预期结果与n=2
:
>>> np.array([
[[True, False], [True, True], [True, True]],
[[False, True], [False, True], [True, True]],
[[True, False], [True, True], [True, True]],
])
注意:我正在使用的阵列非常大,因此我正在寻找一种矢量化方法来最小化性能影响。实际的布尔数组可以有数千个元素长
我试过:
n = 2
c = len(maskArr[0]) ## c = 6 (number of columns)
nResultColumns = int(c / n) ## nResultColumns = 3
combinedMaskArr = [np.all(maskArr[:,i*n:i*n+n], axis=1) for i in range(nResultColumns)]
这给了我:
>>> [
array([[True, False], [False, True], [True, False]]),
array([[True, True], [False, True], [True, True]]),
array([[True, True], [True, True], [True, True]])
]
上面的输出不是预期的格式或值
关于如何达到预期结果,有何指导或建议
先谢谢你
如果我正确理解了你的问题,下面的方法是有效的
如果
cols
可被n
整除,我认为这是可行的:相关问题 更多 >
编程相关推荐