2024-04-20 06:38:45 发布
网友
我可能太傻了,但我需要一个快速的版本:
for i in range(0,4): c.append((0,0,0)) out: [(0,0,0),(0,0,0),(0,0,0),(0,0,0)]
我想在shape of (xL,)中创建一个zero filled tuple,x是(0,0,0)'s的量。。。我现在有三个解决方案,没有一个包括np.zero
shape of (xL,)
zero filled tuple
(0,0,0)'s
np.zero
如果您只需要一个元组列表,那么您应该使用普通的python,numpy不会加快速度,因为您需要在numpy数组和列表/元组之间来回转换。
这个应该足够快:
def mkTuples(x, L): return [(0,)*L]*x
比较:
In [1]: import numpy as np In [2]: x, L = 10**5, 4 In [3]: %timeit map(tuple, np.zeros((x,L))) 10 loops, best of 3: 177 ms per loop In [4]: %timeit [(0,)*L]*x 1000 loops, best of 3: 1.07 ms per loop
如果必须是numpy数组,可以执行以下操作:
a = np.emtpy(x, dtype=tuple) a[:] = ((0,)*L,)
它的速度与普通python版本大致相同,但会产生一个包含元组的numpy数组。
我希望np.full(x, (0,)*L, dtype=tuple)可以工作,但是numpy希望广播第二个参数,即使它实际上对应于一个条目。把它包装成上面这样的另一个元组也不起作用。
np.full(x, (0,)*L, dtype=tuple)
您可以使用^{}:
>>> import numpy as np >>> np.zeros(4*3).reshape(4,3) array([[ 0., 0., 0.], [ 0., 0., 0.], [ 0., 0., 0.], [ 0., 0., 0.]])
如果你想把它变成元组:
>>> map(tuple,np.zeros(4*3).reshape(4,3)) [(0.0, 0.0, 0.0), (0.0, 0.0, 0.0), (0.0, 0.0, 0.0), (0.0, 0.0, 0.0)]
或者正如@Divakar在评论中提到的,在zeros函数中使用服装形状是一种更优雅的方式:
zeros
map(tuple,np.zeros((4,3),dtype=int))
您可以选择结构化阵列路径:
In [304]: np.zeros((10,),dtype='i,i,i') Out[304]: array([(0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0)], dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4')])
严格地说,这些不是元组-它只是将它们显示为元组。
但是要获得元组列表,只需使用tolist:
tolist
In [305]: np.zeros((10,),dtype='i,i,i').tolist() Out[305]: [(0, 0, 0), (0, 0, 0), (0, 0, 0), ... (0, 0, 0), (0, 0, 0), (0, 0, 0)]
您可以使用由','.join(['i']*3)生成的字符串来泛化元组长度
','.join(['i']*3)
对于非结构化方法,我将使用
[tuple(x) for x in np.zeros((10,3),int)]
在Python3中(特别是),我更喜欢列表理解,而不是等价的映射:list(map(tuple, np.zeros((10,3),int)))。
list(map(tuple, np.zeros((10,3),int)))
一些计时(L=10**5):
L=10**5
结构化阵列:
In [340]: timeit np.zeros((L,),dtype='i,i,i') 10000 loops, best of 3: 77.5 µs per loop
已转换为元组列表的结构化数组:
In [341]: timeit np.zeros((L,),dtype='i,i,i').tolist() 10 loops, best of 3: 73.6 ms per loop
二维数组中的元组列表:
In [342]: timeit [tuple(x) for x in np.zeros((L,3),int)] 1 loops, best of 3: 223 ms per loop
纯python元组列表:
In [343]: timeit [(0,0,0) for _ in range(L)] 100 loops, best of 3: 15.1 ms per loop
元组的最佳列表(@swensel):
@swensel
In [344]: timeit [(0,0,0)]*L 1000 loops, best of 3: 429 µs per loop
如果最终目标是一个元组列表,那么就坚持使用Python。
如果目标是一个numpy结构的数组,那么直接执行。
在使用[(0,0,0)]*L时需要注意的一点是,这通过简单地复制指针来实现其速度。列表中的每个条目都指向同一个元组。对于可能有严重问题的嵌套列表:
[(0,0,0)]*L
x = [[0,0,0]]*L x[1][1] = 3
更改每个子列表。对于元组来说,这并不是什么大问题,因为它们是不可变的。
如果您只需要一个元组列表,那么您应该使用普通的python,numpy不会加快速度,因为您需要在numpy数组和列表/元组之间来回转换。
这个应该足够快:
比较:
如果必须是numpy数组,可以执行以下操作:
它的速度与普通python版本大致相同,但会产生一个包含元组的numpy数组。
我希望
np.full(x, (0,)*L, dtype=tuple)
可以工作,但是numpy希望广播第二个参数,即使它实际上对应于一个条目。把它包装成上面这样的另一个元组也不起作用。您可以使用^{} :
如果你想把它变成元组:
或者正如@Divakar在评论中提到的,在
zeros
函数中使用服装形状是一种更优雅的方式:您可以选择结构化阵列路径:
严格地说,这些不是元组-它只是将它们显示为元组。
但是要获得元组列表,只需使用
tolist
:您可以使用由
','.join(['i']*3)
生成的字符串来泛化元组长度对于非结构化方法,我将使用
在Python3中(特别是),我更喜欢列表理解,而不是等价的映射:
list(map(tuple, np.zeros((10,3),int)))
。一些计时(
L=10**5
):结构化阵列:
已转换为元组列表的结构化数组:
二维数组中的元组列表:
纯python元组列表:
元组的最佳列表(
@swensel
):如果最终目标是一个元组列表,那么就坚持使用Python。
如果目标是一个numpy结构的数组,那么直接执行。
在使用
[(0,0,0)]*L
时需要注意的一点是,这通过简单地复制指针来实现其速度。列表中的每个条目都指向同一个元组。对于可能有严重问题的嵌套列表:更改每个子列表。对于元组来说,这并不是什么大问题,因为它们是不可变的。
相关问题 更多 >
编程相关推荐