首页 > 解决方案 > 创建矩阵的最快方法是彼此的乘积

问题描述

假设我有一个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 中的任何函数都可以重新用于快速生成这样的矩阵吗?

标签: pythonnumpy

解决方案


由于您正在寻找不重复的列组合(即 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]])                        
               

推荐阅读