给定包含 n 个元素的数组[x1 x2 x3 ... xn]
,希望生成这样的包含K行的以下数组:
[[x1 x2 x3 ... xn],
[x1^2 x2^2 x3^2 ... xn^2],
[x1^3 x2^3 x3^3 ... xn^3],
...,
[x1^K x2^K x3^K ... xn^K]].
如何有效地获得?
答案 0 :(得分:3)
您可以使用numpy.power.outer
:
>>> K=9
>>> numpy.power.outer(numpy.array([1, 4, 5]), numpy.arange(1, K+1)).T
array([[ 1, 4, 5],
[ 1, 16, 25],
[ 1, 64, 125],
[ 1, 256, 625],
[ 1, 1024, 3125],
[ 1, 4096, 15625],
[ 1, 16384, 78125],
[ 1, 65536, 390625],
[ 1, 262144, 1953125]])
答案 1 :(得分:0)
您正在查看时间复杂度为O(kn)的算法:
def build_value_lists(base_numbers, max_exponent):
value_lists = []
for k in range(1, max_exponent+1):
values = []
for x in base_numbers:
values.append(x**k)
value_lists.append(values)
return value_lists
base_numbers = [1, 2, 3, 4, 5];
max_exponent = 3
print build_value_lists(base_numbers, max_exponent)
由于您需要一个包含所有值的Python列表,因此很难使该算法更加有效。如果您只是想让代码运行得更快,请注意线程化不可能提高性能。 Multiprocessing是您最好的选择。想法是创建一个工作人员池,每个工作人员针对k
的一个值计算单个列表的结果。当每个工作者完成任务时,结果都可以添加到清单中。
答案 2 :(得分:0)
您可以使用PolynomialFeatures
测试列:
import numpy as np
col = np.linspace(1, 5, 5).reshape((-1, 1))
转换:
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=4, include_bias=False)
poly.fit_transform(col).T
> array([[ 1., 2., 3., 4., 5.],
[ 1., 4., 9., 16., 25.],
[ 1., 8., 27., 64., 125.],
[ 1., 16., 81., 256., 625.]])
答案 3 :(得分:0)
使用**运算符在power.outer
上进行变体并广播:
In [223]: np.arange(1,5)**np.arange(1,4)[:,None]
Out[223]:
array([[ 1, 2, 3, 4],
[ 1, 4, 9, 16],
[ 1, 8, 27, 64]])
答案 4 :(得分:0)
您可以使矩阵重复K次,然后使用numpy的cumprod()
result = np.cumprod([arr,]*k,axis=0)
如果您不使用numpy,则常规python列表也可以使用itertools中的accumulate进行相同的操作。
result = accumulate( ([arr]*k), func=lambda a,b: [x*y for x,y in zip(a,b)])
这将比使用numpy慢得多。
注意:accumulate返回一个迭代器,您可以使用list(result)
答案 5 :(得分:0)
这是非常著名的矩阵,称为Vandermonde matrix。 Numpy程序包中有一个特殊功能来获取此矩阵:
import numpy as np
np.fliplr(np.vander([2,3,4], 5)).T
> array([[ 1, 1, 1],
[ 2, 3, 4],
[ 4, 9, 16],
[ 8, 27, 64],
[ 16, 81, 256]])