2017-11-05 6 views
0

私が見つけることができるドキュメントによると、派手な索引付けを使用すると、ビューではなくコピーが返されます。私はB__getitem__への呼び出しを取得する一方Aがちょうど__setitem__への呼び出しを受けることを理解ナンシー・ファンシー・インデクシング・コピーの値は、別のアレイに直接入りますか?

A = np.arange(0,10) 
B = np.arange(-10,0) 
fancy_slice = np.array([0,3,5]) 
A[fancy_slice] = B[fancy_slice] 

:しかし、私は、例えば別の配列にその動作が割り当て中にあるかを把握できませんでした。私が心配しているのは、Aに値をコピーする前に中間配列を作成するかどうかです。

答えて

0

インタプリタはコードを解析してメソッド呼び出しを発行します: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.atcopytoplaceput、などです。このインデックス付けされた割り当ては、ほとんどの場合、十分です。 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は遅いです。

puttakeには優れていません:

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) 
0

中間配列が作成されます。 にはが作成されています。 numpyのは、コンテキストが何であるか全く分からないと、それは自分自身で

    B[fancy_slice] 

を見

A[fancy_slice] = B[fancy_slice] 

は表示されません。この操作は新しい配列を作成するために定義され、NumPyは新しい配列を作成します。

はその後、numpyのはA

A[fancy_slice] = <the array created by the previous operation> 

とコピーデータを見ています。

関連する問題