4

numpy の名前付き配列を使用すると、次の 2 つのケースで異なる動作が観察されます。

  1. ケース: 最初に高度なスライスにインデックス配列を使用し、次にサブ配列を名前で選択する
  2. ケース: 最初にサブ配列を名前で選択し、次にインデックス配列を使用して高度なスライスを行う

次のコードは例を示しています

import numpy as np

a = np.ones(5)
data = np.array(zip(a, a, a), dtype=[("x", float), ("y", float), ("z", float)])

# case 1
# does not set elements 1, 3 and 4 of data to 22
data[[1, 3, 4]]["y"] = 22    
print data["y"]  # -> [ 1.  1.  1.  1.  1.]

# case 2
# set elements 1, 3 and 4 of data to 22
data["y"][[1, 3, 4]] = 22
print data["y"]  # -> [  1.  22.   1.  22.  22.]

2 つの印刷コマンドの出力は、[ 1. 1. 1. 1. 1.] と [ 1. 22. 1. 22. 22.] です。要素を設定するときに、選択の順序を変更すると結果が異なるのはなぜですか?

4

1 に答える 1

3

リストまたは配列でインデックスを作成すると、常にビューではなくコピーが返されます

In [1]: np.may_share_memory(data, data[[1, 3, 4]])
Out[1]: False

したがって、代入は のコピーdata[[1, 3, 4]]["y"] = 22変更しており、 の元の値は影響を受けません。data[[1, 3, 4]]data

一方、構造化配列のフィールドを参照すると、ビューが返されます

In [2]: np.may_share_memory(data, data["y"])
Out[2]: True

に割り当てると、 の対応する要素に影響しdata["y"][[1, 3, 4]] ますdata

于 2016-09-29T15:48:50.160 に答える