按列合并两个数组

时间:2014-02-06 16:02:11

标签: python arrays numpy

假设我有两个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]])

2 个答案:

答案 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