在numpy中复制或切换数组内容

时间:2014-05-22 19:03:09

标签: python arrays numpy

numpy中的一种流行做法是[:] = b [:],它将数组b的内容复制到数组a。当然,两个阵列a和b必须具有相同的大小。但很多时候我们想要的只是切换内容。例如,在有限差分方法的时间步进中,在每个时间步长结束时,当前时间步长数组a被[:] = b [:]更新为新的时间步长。我自己倾向于使用另一种方法a,b = b,a。由于a和b可以作为参考,我觉得后者更轻巧/高效。以下是一个小型基准脚本:

#!/usr/bin/python
import time
import numpy as np

a = np.random.random((100,100))
b = np.random.random((100,100))

N = 1000

print 'Method 1: a[:] = b[:]'
tstart = time.time()
for i in range(N):
    a[:] = b[:]
tend = time.time()
print tend - tstart

print 'Method 2: a, b = b, a'
tstart = time.time()
for i in range(N):
    a, b = b, a
tend = time.time()
print tend - tstart

我的笔记本电脑方法1次4毫秒,而方法2次0.1毫秒,所以后者快40倍。我遇到的许多数字代码都不必要地使用[:] = b [:]。我觉得只要我们的真正目的是切换两个数组,我们应该使用a,b = b,a。并且只有当我们想要的只是b的副本(并且不再是)时,才应该使用[:] = b [:]。即使我每天都使用它,我也不会对numpy有深入的了解,所以我在这里发布,希望有些人可以对此有所了解。 *就在我发布之前,我发现两年前提出的另一个问题主要涉及同步问题(Swap Array Data in NumPy

更新:这更多的是一个意见而不是一个问题,我希望人们使用numpy知道这种方法和显着的速度差异,并避免不必要的数组副本。

1 个答案:

答案 0 :(得分:1)

a, b = b, a可以很好地简单地交换与名称相关联的数据,只要您不在函数中执行此操作并期望更改传播出去。 e.g:

# wrong:
def swap(a, b):
    a, b = b, a
swap(x, y)  # x is still x and y is still y

# right-ish -- You really don't need the function if you're gonna do it this way.
def swap(a, b):
    return b, a
a, b = swap(a, b)

另请注意,我认为b[:] = a[:]更容易理解而不是b = a.copy(),而不是b,而不需要预先分配{{1}}。性能差异可能无关紧要(尽管我还没有经过测试)。