我有一个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是一个相关的(更简单的)问题。
1条答案
按热度按时间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上求和: