python - 创建矩阵的最快方法是彼此的乘积
问题描述
假设我有一个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]])
推荐阅读
- node.js - Shopify API - 获取所有产品(60k 产品)请求超时或套接字挂断
- javascript - 隐藏可见区域之外的项目
- python - 如何使用 csv 模块计算出现次数并计算评分?
- javascript - Dialogflow 在没有用户意图的情况下发送消息
- c - 如何求解 4 个变量的方程
- c - int c 与 c == "\n" 和 c ==" " 冲突?
- java - 如何编写Java语句来显示2个数字之间的整数?
- android - 如何从奥利奥的内部存储中打开 PDF 文件?
- java - 使用 Java Stream 比较两个整数数组
- vba - 如何从 Outlook 电子邮件正文中复制电子邮件地址并将其插入新电子邮件的收件人字段?