假设我有两个numpy数组a = (n x m)
和b = (z x m)
,其中m列是一些常用标识符。
a = np.array([[1, 0, 0, 1], [0, 1, 0, 1], [0, 0, 0, 1], [1, 1, 0, 1]])
b = np.array([[1, 0, 0, 1], [1, 1, 0, 1], [0, 1, 1, 0]])
是否有一种直接的方式来c = (n x z)
c_ij = 1 if (any element in (row i of a AND row j of b) is equal to 1) else 0
没有循环,所以在这种情况下
c = np.array([[1, 1, 0], [1, 1, 1], [1, 1, 0], [1, 1, 1]])
答案 0 :(得分:2)
IIUC,您可以将其视为矩阵乘法:
>>> a = np.array([[1, 0, 0, 1], [0, 1, 0, 1], [0, 0, 0, 1], [1, 1, 0, 1]])
>>> b = np.array([[1, 0, 0, 1], [1, 1, 0, 1], [0, 1, 1, 0]])
>>> (a.dot(b.T) > 0).astype(int)
array([[1, 1, 0],
[1, 1, 1],
[1, 1, 0],
[1, 1, 1]])
缺点是这种方法比它需要做更多的工作,因为它完成了整个乘法。如果性能非常重要(而且它的关键性比人们认为的那么重要),你可以编写一些cython或使用numba以类似C的速度恢复短路行为。不过,其中一个当地的numpy向导可能会想到一些聪明的东西。 :^)
答案 1 :(得分:0)
我知道你说过没有循环,但这有效:
np.array([[np.any(x&y) for x in a] for y in b],dtype=int).T