Python 填充阵列的最快方法?
我想像这样填充一个大小为n的数组(一个非常大的数组): 是迭代0到n并对每个语句使用if语句和%的最快方法吗 像这样:Python 填充阵列的最快方法?,python,algorithm,mod,Python,Algorithm,Mod,我想像这样填充一个大小为n的数组(一个非常大的数组): 是迭代0到n并对每个语句使用if语句和%的最快方法吗 像这样: array = [] for index in range(1,n): if index == 1 or (index % ((n/2)+1) == 0): array.append(1) if index == 2 or index == 3 or (index % (n/2) == 0): array.append(2)
array = []
for index in range(1,n):
if index == 1 or (index % ((n/2)+1) == 0):
array.append(1)
if index == 2 or index == 3 or (index % (n/2) == 0):
array.append(2)
if (index % ((n/2)+2) == 0):
array.append(0)
我试着想其他方法来做这件事,但我没有想出任何办法。我不是一名程序员,但我不确定我还能如何实现这一点。您可能想使用
numpy
实现这一点。您可以使用来连接多个切片,并使用它们来切片分配数组:
import numpy as np
n = 10
a = np.zeros(n)
a[np.r_[0,n//2]] = 1
a[np.r_[1:n//2]] = 2
a[np.r_[n//2+1:n]] = 0
print(a)
array([1., 2., 2., 2., 2., 1., 0., 0., 0., 0.])
由于其他答案都是numpy数组,速度非常快,为了完整性,我想添加一些其他答案。(如果n是奇数,那么应该怎么做,以及作者期望的是基于零的索引还是基于一的索引,在最初的问题中显然有些模糊。) 您可以使用列表理解创建一个非常简单的列表
[1 if i in [0, n/2] else (2 if i <=(n/2) else 0) for i in range(0, n)]
[1如果i在[0,n/2]else中(2如果i>唯一列表=NewThing(len(u))
>>>唯一_列表[4]
2.
>>>唯一的\u列表。到\u列表()
[1, 2, 2, 2, 2, 1, 0, 0, 0, 0]
您可以调用整个列表,也可以只调用单个元素。创建整个列表仍然很慢。构建此类集合的最有效方法是使用numpy数组 我们可以通过以下方式来构建:
import numpy as np
def generate_array(n):
a = np.hstack((np.full(n//2+1, 2), np.zeros(n//2-1)))
a[[0, n//2]] = 1
return a
例如:
>>> generate_array(6)
array([1., 2., 2., 1., 0., 0.])
>>> generate_array(10)
array([1., 2., 2., 2., 2., 1., 0., 0., 0., 0.])
>>> generate_array(16)
array([1., 2., 2., 2., 2., 2., 2., 2., 1., 0., 0., 0., 0., 0., 0., 0.])
计时:
对于n=100_000
,我们得到:
>>> timeit(partial(generate_array, 100_000), number=10_000)
1.0764452270013862
>>> timeit(partial(generate_array, 1_000_000), number=1_000)
6.448311180000019
对于n=1\u 000\u 000
,我们得到:
>>> timeit(partial(generate_array, 100_000), number=10_000)
1.0764452270013862
>>> timeit(partial(generate_array, 1_000_000), number=1_000)
6.448311180000019
因此,生成一个100k元素的阵列大约需要107.64µs(包括
部分的小开销等),生成一个1M元素的阵列需要6448.31µs。对于偶数n
:
def generate_array2(n):
a = np.empty((2,n//2))
a[0]=2
a[1]=0
a[:,0]=1
return a.ravel()
%timeit a= generate_array2(1_000_000)
491 ± 6.58 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
所有这些都不起作用。你不能通过分配给索引来创建列表元素,你必须使用array.append()
。一般来说,不,循环设置每个项目并不是最快的。但首先要做几件事:(1)什么是u
?(2)你如何处理奇数n?顺便说一句,[]
创建一个列表,而不是数组。Python只在模块中有数组,如numpy
。什么是i
,它应该与index
相同吗?对不起,“i”应该是index;我应该使用array.append;len(u)=n第一个元素不应该是0
?不,我认为OPs1
是起始位置(0)@bramarIt应该是[0,1,2,2,0,0,0,0,0]
@Barmar,yatu:规范没有为第一个元素定义任何东西,因为它是零基的,如果它是一基的,第一个元素是1。@WillemVanOnsem是的,我假设ifrst元素是1,也是因为最后一个元素是n,而不是n-1
>>> timeit(partial(generate_array, 1_000_000), number=1_000)
6.448311180000019
def generate_array2(n):
a = np.empty((2,n//2))
a[0]=2
a[1]=0
a[:,0]=1
return a.ravel()
%timeit a= generate_array2(1_000_000)
491 ± 6.58 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)