Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python从基本数组创建多个数组_Python_Numpy_Ipython_Spyder - Fatal编程技术网

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

Python从基本数组创建多个数组,python,numpy,ipython,spyder,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]]. 如何有效地获得此功能?您可以使用numpy.power.outer: >>> K=9 >>> numpy.power.outer(numpy.arr

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

如何有效地获得此功能?

您可以使用
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]])

您看到的是一个时间复杂度为O(kn)的算法:

def构建值列表(基本值、最大指数):
值列表=[]
对于范围内的k(1,最大指数+1):
值=[]
对于基数中的x:
附加值(x**k)
值\u列表。附加(值)
返回值列表
基数=[1,2,3,4,5];
最大指数=3
打印构建值列表(基本值、最大指数)
因为您需要一个包含所有值的Python列表,所以很难使该算法更加高效。如果您只是想让代码运行得更快,那么请注意线程不太可能提高性能。这是你最好的选择。其想法是创建一个工作人员池,每个工作人员为一个
k
值计算单个列表的结果。当每个工作人员完成其任务时,结果可以附加到包含列表中。

您可以使用

测试列:

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.]])

使用**操作符和广播时,
电源外部的变化:

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

您可以创建一个矩阵,将数组重复K次,然后使用numpy的cumprod()

如果您没有使用numpy,那么常规python列表可以使用itertools中的accumulate执行相同的操作

result = accumulate( ([arr]*k), func=lambda a,b: [x*y for x,y in zip(a,b)])
不过,这将比使用numpy慢得多


注意:累积返回一个迭代器,您可以将它转换回具有
列表(结果)

的列表这是非常著名的矩阵,它被称为。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]])

您能否展示您尝试过的内容,以便我们建议如何优化您的解决方案?您有一个阵列,
[x1 x2 x3…xn]
,您希望将其提升到
[1,2,3,…k]
。我假设^是一个幂,在Python中通常表示为**。
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]])