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知道这种方法和显着的速度差异,并避免不必要的数组副本。
答案 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}}。性能差异可能无关紧要(尽管我还没有经过测试)。