37

私はpythonとnumpyが初めてです。インデックスとして使用されるいくつかの配列のインデックス付けを行う方法を理解するのに役立つものがありますか。このような次の6つの2D配列があります-

array([[2, 0],
   [3, 0],
   [3, 1],
   [5, 0],
   [5, 1],
   [5, 2]])

これらの配列をインデックスとして使用し、値 10 を新しい空の行列の対応するインデックスに入れたいと思います。出力は次のようになります-

array([[ 0,  0,  0],
   [ 0,  0,  0],
   [10,  0,  0],
   [10, 10,  0],
   [ 0,  0,  0],
   [10, 10, 10]])

これまでのところ、私はこれを試しました-

    from numpy import*
    a = array([[2,0],[3,0],[3,1],[5,0],[5,1],[5,2]])
    b = zeros((6,3),dtype ='int32')
    b[a] = 10

しかし、これは私に間違った出力を与えます。何か助けてください。

4

1 に答える 1

58
In [1]: import numpy as np
In [2]: a = np.array([[2,0],[3,0],[3,1],[5,0],[5,1],[5,2]])
In [3]: b = np.zeros((6,3), dtype='int32')

In [4]: b[a[:,0], a[:,1]] = 10

In [5]: b
Out[5]: 
array([[ 0,  0,  0],
       [ 0,  0,  0],
       [10,  0,  0],
       [10, 10,  0],
       [ 0,  0,  0],
       [10, 10, 10]])

機能する理由:

代入で2 つのnumpy 配列を使用してインデックスbを作成すると、

b[x, y] = z

次に、NumPy が の各要素と のx各要素とyの各要素を同時に移動し (それらをとz呼びましょう)、b[xval, yval] に value を割り当てると考えてください。Whenは定数であり、「移動すると毎回同じ値が返されます。xvalyvalzvalzvalzz

xの最初の列でaありy、 の 2 番目の列であることで、それが私たちが望んでいることですa。したがって、x = a[:, 0]、およびを選択しますy = a[:, 1]

b[a[:,0], a[:,1]] = 10

b[a] = 10うまくいかない理由

を記述するときはb[a]、NumPy を , の各要素を移動して新しい配列を作成しa(それぞれを と呼びましょう)、新しい配列のinの位置にidxの値を配置すると考えてください。b[idx]idxa

idxの値ですa。つまり、int32 です。 bの形状は (6,3) であるため、形状 (3,)b[idx]の行も同様です。bたとえばidx

In [37]: a[1,1]
Out[37]: 0

b[a[1,1]]

In [38]: b[a[1,1]]
Out[38]: array([0, 0, 0])

そう

In [33]: b[a].shape
Out[33]: (6, 2, 3)

繰り返しましょう: NumPy は、 の各要素を移動し、新しい配列のinの位置にaの値を配置することで、新しい配列を作成しています。上に移動すると、形状 (6,2) の配列が作成されます。しかし、それ自体が (3,) の形をしているので、(6,2) 形の配列の各位置に (3,) 形の値が配置されています。結果は形状 (6,2,3) の配列です。b[idx]idxaidxab[idx]

さて、次のような割り当てを行うと

b[a] = 10

値を持つ形状 (6,2,3) の一時的な配列b[a]が作成され、割り当てが実行されます。10 は定数であるため、この代入は (6,2,3) 形状の配列の各位置に値 10 を配置します。次に、一時配列の値が に再割り当てされbます。ドキュメントへの参照を参照してください。したがって、(6,2,3) 形状の配列の値は (6,3) 形状の配列にコピーされますb。値は互いに上書きします。しかし、要点は、あなたが望んでいる仕事を手に入れられないということです。

于 2013-05-06T09:55:27.993 に答える