インタプリタはコードを解析してメソッド呼び出しを発行します:B
方法はA
メソッドに渡される前に完全に評価され
A[idx] = B[idx]
A.__setitem__(idx, B.__getitem__(idx))
。 numpy
は、Pythonインタプリタまたはその構文を変更しません。むしろ、関数、オブジェクト、およびメソッドを追加するだけです。
機能的には、それは私たちだけで必ずいくつかのtimeit
を行うことができ
temp = B[idx]
A[idx] = temp
del temp
と同等でなければなりません。
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)