Python/Numpy:在多维数组的分组列中按行组合布尔掩码
Python/Numpy: Combining boolean masks by row in grouped columns in multidimensional array
我有一个具有 r
行和 c
列的 3D 布尔数组(布尔掩码数组的 2D numpy 数组)。在下面的示例中,数组形状为 (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
所有 每一行中的掩码数组 ,但我想and
将每行中的布尔数组以 n
列的增量组合在一起。
因此,如果我们从上面的 6 列开始,并且 n=2
,我想在每 2 列上应用 np.all
的等价物以获得 3 列的最终结果,其中:
- 结果数组的第一列等于原始数组前 (2) 列的行
AND
加在一起 - result[:,0] = np.all(maskArr[:,0:1], axis=1)
- 结果数组的第二列等于原始数组第二 (2) 列的行
AND
。 - result[:,1] = np.all(maskArr[:,2:3], axis=1)
- 结果数组的第三列等于原始数组最后 (2) 列的行
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]])
]
上面的输出不是预期的格式或值。
关于如何达到预期结果有任何指导或建议吗?
提前谢谢你。
如果我对你的问题的理解正确,则以下内容有效。
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)
我有一个具有 r
行和 c
列的 3D 布尔数组(布尔掩码数组的 2D numpy 数组)。在下面的示例中,数组形状为 (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
所有 每一行中的掩码数组 and
将每行中的布尔数组以 n
列的增量组合在一起。
因此,如果我们从上面的 6 列开始,并且 n=2
,我想在每 2 列上应用 np.all
的等价物以获得 3 列的最终结果,其中:
- 结果数组的第一列等于原始数组前 (2) 列的行
AND
加在一起 -result[:,0] = np.all(maskArr[:,0:1], axis=1)
- 结果数组的第二列等于原始数组第二 (2) 列的行
AND
。 -result[:,1] = np.all(maskArr[:,2:3], axis=1)
- 结果数组的第三列等于原始数组最后 (2) 列的行
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]])
]
上面的输出不是预期的格式或值。
关于如何达到预期结果有任何指导或建议吗?
提前谢谢你。
如果我对你的问题的理解正确,则以下内容有效。
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)