+-
使用np.zero创建元组
我可能只是太傻了,但我需要一个快速版本:

for i in range(0,4):
    c.append((0,0,0))

out: [(0,0,0),(0,0,0),(0,0,0),(0,0,0)] 

我想创建一个零填充的元组,形状为(xL,),x为(0,0,0)的数量…我现在有三个工作解决方案,其中没有一个包含np.zero

最佳答案
你可以去结构化阵列路线:

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:

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)

对于非结构化方法,我会使用

[tuple(x) for x in np.zeros((10,3),int)]

在Python3(特别是)中,我更喜欢列表理解而不是等效的map:list(map(tuple,np.zeros((10,3),int))).

一些时间(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

来自2d数组的元组列表:

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

In [344]: timeit [(0,0,0)]*L
1000 loops, best of 3: 429 µs per loop

如果最终目标是元组列表,请坚持使用Python.

如果目标是一个numpy结构化数组,请直接进行.

使用[(0,0,0)] * L时要注意的一件事情;这通过简单地复制指针来实现其速度.列表中的每个条目都指向相同的元组.使用可能存在严重问题的嵌套列表:

x = [[0,0,0]]*L
x[1][1] = 3

更改每个子列表.对于元组,这不是一个问题,因为它们是不可变的.

点击查看更多相关文章

转载注明原文:使用np.zero创建元组 - 乐贴网