Python从基本数组创建多个数组
给定包含n个元素的数组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
[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]])