我有两个形状为(n,m)
的numpy数组x
和形状为(p,)
的y
。我想对所有可能的对x[k, i]
和y[j]
求和,以创建形状为(n, m*p)
的新numpy数组z
。
一个天真的算法是:
import numpy as np
# some code
z = np.empty((n, m*p))
for k in range(n):
for i in range(m):
for j in range(p):
z[k, i + m * j] = x[k, i] + y[j]
该算法具有多项式复杂度:O(n*m*p)
知道我正在用$n~1e6$处理数组,我正在寻找一种使用numpy和/或panda的力量的更有效的算法。
我做了一些研究,找到了一个可能的解决方案:求和所有可能对的有效方法
但它不适合我的特定问题,我的意思是我可以使用它,但它仍然不会像我用一个循环迭代那样是蟒蛇式的(对于n=1,该解决方案是可重用的,无需太多努力(。
正如其他人在评论中所说,没有提高复杂性,而是利用了矢量化和内存邻接性:
np.add.outer(X,y).reshape(len(X), -1)