【发布时间】:2021-11-23 12:55:10
【问题描述】:
给定一个形状为 [m,m] 的二维 numpy 数组 X,我希望应用一个函数并获得一个新的二维 numpy 矩阵 P,它的形状也是 [m,m],其 [i ,j]th 元素得到如下:
P[i][j] = exp (-|| X[i] - x[j] ||**2)
其中||.|| 表示向量的标准 L-2 范数。有没有比简单的嵌套 for 循环更快的方法?
例如,
X = [[1,1,1],[2,3,4],[5,6,7]]
然后,在对角线条目处,访问的行将是相同的,它们的差异的范数/大小将为 0。因此,
P[0][0] = P[1][1] = P[2][2] = exp (0) = 1.0
还有,
P[0][1] = exp (- || X[0] - X[1] ||**2) = exp (- || [-1,-2,-3] || ** 2) = exp (-14)
等等
使用嵌套for循环的最简单的解决方案如下:
import numpy as np
X = np.array([[1,2,3],[4,5,6],[7,8,9]])
P = np.zeros (shape=[len(X),len(X)])
for i in range (len(X)):
for j in range (len(X)):
P[i][j] = np.exp (- np.linalg.norm (X[i]-X[j])**2)
print (P)
打印出来:
P = [[1.00000000e+00 1.87952882e-12 1.24794646e-47]
[1.87952882e-12 1.00000000e+00 1.87952882e-12]
[1.24794646e-47 1.87952882e-12 1.00000000e+00]]
这里,m 是 5e4 的数量级。
【问题讨论】:
-
@j1-lee 其实不是,X[i] 代表一维向量
-
为了清楚起见,给我们一个工作示例,必要时使用嵌套循环。然后花点时间阅读
numpybroadcasting。 -
@hpaulj 我刚刚给出了一个简单实现的工作代码
标签: python numpy matrix-multiplication