Python Numpy是否将值直接复制到另一个数组?
根据我能找到的文档,当使用花式索引时,会返回副本而不是视图。但是,我无法弄清楚它在分配给另一个数组期间的行为,例如:Python Numpy是否将值直接复制到另一个数组?,python,arrays,numpy,Python,Arrays,Numpy,根据我能找到的文档,当使用花式索引时,会返回副本而不是视图。但是,我无法弄清楚它在分配给另一个数组期间的行为,例如: A = np.arange(0,10) B = np.arange(-10,0) fancy_slice = np.array([0,3,5]) A[fancy_slice] = B[fancy_slice] 据我所知,A只会接到对\uuuuuuu setitem\uuuuu的呼叫,B会接到对\uuuuu getitem\uuuuu的呼叫。我关心的是,在将值复制到A之前是否创建
A = np.arange(0,10)
B = np.arange(-10,0)
fancy_slice = np.array([0,3,5])
A[fancy_slice] = B[fancy_slice]
据我所知,
A
只会接到对\uuuuuuu setitem\uuuuu
的呼叫,B
会接到对\uuuuu getitem\uuuuu
的呼叫。我关心的是,在将值复制到A
之前是否创建了一个中间数组,解释器将解析代码并发出如下方法调用:
A[idx] = B[idx]
A.__setitem__(idx, B.__getitem__(idx))
B
方法在传递给A
方法之前会进行全面评估numpy
不会改变Python解释器或其语法。相反,它只是添加函数、对象和方法
在功能上,它应该与
temp = B[idx]
A[idx] = temp
del temp
我们可以做一些timeit
只要确定
In [712]: A = np.zeros(10000,int)
In [713]: B = np.arange(10000)
In [714]: idx = np.arange(0,10000,100)
In [715]: timeit A[idx] = B[idx]
1.2 µs ± 3.24 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [716]: %%timeit
...: temp = B[idx]
...: A[idx] = temp
...:
1.11 µs ± 0.669 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
有一些可选的函数/方法,如add.at
,copyto
,place
,put
,它们可以在没有中间版本的情况下进行一些复制,但我没有太多使用它们。这种索引分配已经足够好了——大多数情况下
带有copyto
In [718]: wh = np.zeros(A.shape, bool)
In [719]: wh[idx] = True
In [721]: np.copyto(A, B, where=wh)
In [722]: timeit np.copyto(A, B, where=wh)
7.47 µs ± 9.92 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
因此,即使没有对布尔掩码的构造进行计时,copyto
的速度也较慢
put
和take
也不是更好的选择:
In [727]: timeit np.put(A,idx, np.take(B,idx))
7.98 µs ± 8.34 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
创建一个中间数组。它必须被创建。努比看不见
A[fancy_slice] = B[fancy_slice]
它看到
B[fancy_slice]
就其本身而言,不知道上下文是什么。此操作定义为生成新数组,NumPy生成新数组
然后,努比看到了
A[fancy_slice] = <the array created by the previous operation>
A[fancy_slice]=
并将数据复制到A