python - 创建矩阵的最快方法,其中列是彼此的乘积

标签 python numpy

假设我有一个矩阵 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/

相关文章:

python - 如何在python中将多个numpy文件附加到一个numpy文件中

python - 相当于 SQL 不存在子查询的 Pandas

python - 在 python 中使用 beautifulsoup 单击链接

python - 谁能解释一下这个列表理解?

python - 为什么这个巨大的(非稀疏的)numpy 矩阵适合 RAM

python - 使用列表中的随机元素创建 numpy 数组

python - 访问列表中的特定字符

python - 是否可以检查发送到 Flask 的 url 是否会出现 404?

python - 在带有元组键的字典上使用Python 'not in',我没有所有元组部分

python - Cython:(为什么/何时)最好使用 Py_ssize_t 进行索引?