2016-08-24 27 views
0

当我想复制一个列表而不链接到同一个对象时,我必须调用列表。所以:使用numpy时,列表的等价物是什么?

a = [1, 2, 3] 
b = list(a) 

a == b 
True 

a is b 
False 

什么是等效的,当我有一个numpy的阵列

import numpy 
a = numpy.ones(4) 

b = XXX(a)? 

在此先感谢

+6

[ndarray.copy()](http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.copy.html) ? – Divakar

+1

在Python 3中,'list'对象也有一个'copy'方法,为了清晰的目的,我认为它击败了所有其他的方法。 –

回答

3

使用copy -method:

b = a.copy() 
-1

可以使用[:]模式来复制一个数组或列表(实际上,只是对于列表而不是数组,请参见下面的更新)。

a = np.ones(4) 
b = a[:] 

>>> b 
array([ 1., 1., 1., 1.]) 

>>> id(a) 
4606143744 

>>> id(b) 
4606143984 

时序

a = np.random.randn(1000000) 

%timeit -n 1000 a.copy() 
1000 loops, best of 3: 1.1 ms per loop 

%timeit -n 1000 a[:] 
1000 loops, best of 3: 659 ns per loop 

更新

我通常会删除错误帖子这样,但我离开它,因为我认为这是有益的。

按照列表的预期工作。

a = [1, 2, 3] 
b = a[:] 
b[2] = 0 

>>> a 
[1, 2, 3] 

>>> b 
[1, 2, 0] 

但正如@ Divakar指出,这似乎并不为numpy的阵列工作:

a = np.array([1, 2, 3]) 
b = a[:] 
b[2] = 0 

>>> a 
array([1, 2, 0]) 

>>> b 
array([1, 2, 0]) 

>>> id(a) 
4600986400 

>>> id(b) 
4606142624 

最好明确使用copy()方法(例如b = a.copy())。

+0

它也似乎工作。但是,在使用关于列表的时候,这不被否定吗?我不记得为什么?我在某处阅读使用清单更好...无论如何。非常感谢。 –

+0

不是'a [:: 1]'a'的视图是否为'np.may_share_memory(a [:: 1],a)'返回'True'? – Divakar

+0

“True的返回并不一定意味着两个数组共享任何元素,而只是意味着它们可能。”但实际上看起来你可能是正确的... – Alexander

相关问题