假设我有一个矩阵 X
,其中包含 n
列。我想创建一个新矩阵 Y
,使得 Y
的每一列都是 X
两个不同列的乘积。
目前,我正在做一个循环,如下所示(不是我的实际代码,但捕获了代码的本质):
Y = np.array(X.shape[0], int(n * (n-1)/2))
cnt = 0
for j1 in range(0, n-1):
for j2 in range(j1+1, n):
Y[:, cnt] = X[:, j1] * X[:, j2]
cnt += 1
我想知道是否有人知道是否有比我正在做的双循环更快的方法来生成(填充)矩阵Y
?例如,numpy 中的任何函数都可以重复使用来快速生成这样的矩阵?
最佳答案
由于您正在寻找不重复的列组合(即 col 0 * col 1 与 col 1 * col 0 相同),我会使用 itertools,因为组合是相对较小的东西(索引):
>>> x = np.arange(24).reshape(6,4)
>>> list(combinations(range(x.shape[1]), 2)) # For illustrative purposes. We want all pairs of different columns.
[(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)] |
>>> np.vstack([x[:, i]*x[:, j] for i, j in combinations(range(x.shape[1]), 2)]).T
array([[ 0, 0, 0, 2, 3, 6],
[ 20, 24, 28, 30, 35, 42],
[ 72, 80, 88, 90, 99, 110],
[156, 168, 180, 182, 195, 210],
[272, 288, 304, 306, 323, 342],
[420, 440, 460, 462, 483, 506]])
关于python - 创建矩阵的最快方法,其中列是彼此的乘积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62508448/