在NumPy数组操作中避免双重for循环

时间:2018-01-15 17:55:58

标签: python arrays numpy scipy

假设我有两个2D NumPy数组AB,我想计算其条目为C的矩阵C[i, j] = f(A[i, :], B[:, j]),其中f为一些函数需要两个1D数组并返回一个数字。

例如,如果def f(x, y): return np.sum(x * y),那么我只会C = np.dot(A, B)。但是,对于一般函数f,是否有我可以利用的NumPy / SciPy实用程序比执行双循环更有效?

例如,取def f(x, y): return np.sum(x != y) / len(x),其中xy不仅仅是0/1位向量。

1 个答案:

答案 0 :(得分:1)

这是一种使用广播的合理通用方法。

首先,重塑你的两个矩阵,使其成为四级张量。

A = A.reshape(A.shape + (1, 1))
B = B.reshape((1, 1) + B.shape)

其次,逐个元素地应用你的函数,而不进行任何减少。

C = f(A, B)  # e.g. A != B

对您的矩阵进行重新整形后,可以将{n}变为broadcast。结果张量C的形状为A.shape + B.shape

第三,通过例如对要丢弃的指数进行求和来应用任何所需的减少量:

C = C.sum(axis=(1, 3)) / C.shape[0]