Python从基本数组创建多个数组

时间:2019-03-24 19:52:30

标签: python numpy ipython spyder

给定包含 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]].

如何有效地获得

6 个答案:

答案 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]])