numpy 按元素或按列三元组求和

juud5qan  于 2023-05-22  发布在  其他
关注(0)|答案(1)|浏览(175)

我有一个NumPy数组A,形状为(n, m),dtype为bool

array([[ True, False, False, False],
       [ True, False, False,  True],
       [False,  True, False, False],
       [False, False, False,  True],
       [False, False, False,  True]])

我想得到R的形状(m, m, m)的dtype int的结果:

array([[[2, 3, 2, 4],
        [3, 3, 3, 5],
        [2, 3, 2, 4],
        [4, 5, 4, 4]],

       [[3, 3, 3, 5],
        [3, 1, 1, 4],
        [3, 1, 1, 4],
        [5, 4, 4, 4]],

       [[2, 3, 2, 4],
        [3, 1, 1, 4],
        [2, 1, 0, 3],
        [4, 4, 3, 3]],

       [[4, 5, 4, 4],
        [5, 4, 4, 4],
        [4, 4, 3, 3],
        [4, 4, 3, 3]]])

其中R[k, i, j]是列k、i和j上的元素逻辑 * 或 * 的和。例如:

R[3, 1, 2] = (np.logical_or(np.logical_or(A[:, 3], A[:, 1]), A[:, 2])).sum()

得到这个结果的一种方法是

R = np.array(
    [[[np.logical_or(np.logical_or(A[:, i], A[:, j]), A[:, k]).sum()
    for i in range(m)] for j in range(m)] for k in range(m)],
)

但这显然不是使用numpy API。可以使用NumPy吗?例如,关于广播,请参阅下面的相关问题。
This是一个相关的(更简单的)问题。

j2qf4p5b

j2qf4p5b1#

对于这些类型的广播问题,我通常会考虑不同的操作对形状的影响。例如,A[:, None, :] * A[:, :, None]将给予形状为(n, m, m)的数组,而A.sum(axis=0)将删除第一个轴,给出形状为(m,)的数组。
假设我们想要一个形状为(m, m, m)的输出,我们首先将A的轴1广播到轴1,2和3中,以获得形状为(n, m, m, m)的中间数组,然后在轴0上求和:

R = (A[:, :, None, None] | A[:, None, :, None] | A[:, None, None, :]).sum(axis=0)

相关问题