Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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_Algorithm_Mod - Fatal编程技术网

Python 填充阵列的最快方法?

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)

我想像这样填充一个大小为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)
    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
?不,我认为OPs
1
是起始位置(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)