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