Python/Numpy:在多维数组中按行组合分组列中的布尔掩码

2024-09-30 20:30:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个三维布尔数组(布尔掩码数组的二维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列的最终结果,其中:

  1. 结果数组的第一列等于原始数组的前(2)列的行AND合并在一起-result[:,0] = np.all(maskArr[:,0:1], axis=1)
  2. 结果数组的第二列等于原始数组的第二(2)列的行AND合并在一起。-result[:,1] = np.all(maskArr[:,2:3], axis=1)
  3. 结果数组的第三列等于原始数组的最后(2)列的行ANDresult[:,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]])
     ]

上面的输出不是预期的格式或值

关于如何达到预期结果,有何指导或建议

先谢谢你


Tags: andfalsetrue元素ifnp数组all
1条回答
网友
1楼 · 发布于 2024-09-30 20:30:57

如果我正确理解了你的问题,下面的方法是有效的

n = 2
cols = mask_arr.shape[1]
chunks = math.ceil(cols / n)
groups = np.array_split(np.swapaxes(mask_arr, 0, 1), chunks)
combined = np.array([np.all(g, axis=0) for g in groups])
result = np.swapaxes(combined, 0, 1)

如果cols可被n整除,我认为这是可行的:

n = 2
rows, cols = mask_arr.shape[0:2]
result = np.all(mask_arr.reshape(rows, cols // n, n, -1), axis=2)

相关问题 更多 >