假设我有两个2D NumPy数组A
和B
,我想计算其条目为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)
,其中x
和y
不仅仅是0/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]