4

私はゼロのnumpy配列を持っています。具体的には、2x3x4 だとします。

x = np.zeros((2,3,4))

そして、0 から 3 までのランダム整数 (x の 3 次元のインデックス) の 2x3 配列があるとします。

>>> y = sp.stats.distributions.randint.rvs(0, 4, size=(2,3))
>>> y
[[2 1 0]
 [3 2 0]]

次の割り当てを効率的に行うにはどうすればよいですか (編集: for ループを使用せず、任意の数の次元と各次元の任意の数の要素で x に対して機能するもの)?

>>> x[0,0,y[0,0]]=1
>>> x[0,1,y[0,1]]=1
>>> x[0,2,y[0,2]]=1
>>> x[1,0,y[1,0]]=1
>>> x[1,1,y[1,1]]=1
>>> x[1,2,y[1,2]]=1
>>> x
array([[[ 0.,  0.,  1.,  0.],
        [ 0.,  1.,  0.,  0.],
        [ 1.,  0.,  0.,  0.]],

       [[ 0.,  0.,  0.,  1.],
        [ 0.,  0.,  1.,  0.],
        [ 1.,  0.,  0.,  0.]]])

ありがとう、ジェームズ

4

3 に答える 3

1

現時点では、最初の2つの次元に沿って平坦化する「単純な」バージョンしか考えられません。このコードは機能するはずです:

shape_last = x.shape[-1]
x.reshape((-1, shape_last))[np.arange(y.size), y.flatten()] = 1

これにより、(ランダムに生成されたy)次のようになります。

array([[[ 0.,  0.,  0.,  1.],
        [ 0.,  0.,  1.,  0.],
        [ 0.,  1.,  0.,  0.]],

       [[ 0.,  1.,  0.,  0.],
        [ 0.,  0.,  0.,  1.],
        [ 0.,  1.,  0.,  0.]]])

重要なのは、複数のnumpy配列を使用してインデックスを作成する場合(高度なインデックス)、numpyはインデックスのペアを使用して配列にインデックスを付けることです。

もちろん、xyが両方ともCオーダーまたはFオーダーであることを確認してください。そうでない場合、とへの呼び出しは異なるオーダーを与える可能性がありますreshapeflatten

于 2012-11-27T22:14:39.760 に答える
1

numpy.meshgrid () を使用して、元の配列と 3 番目の次元の値の配列の両方にインデックスを付けるために使用できるインデックスの配列を作成します

import numpy as np
import scipy as sp
import scipy.stats.distributions

a = np.zeros((2,3,4))
z = sp.stats.distributions.randint.rvs(0, 4, size=(2,3))

xx, yy = np.meshgrid( np.arange(2), np.arange(3) )
a[ xx, yy, z[xx, yy] ] = 1
print a

わかりやすくするために、配列の名前を x から a に、インデックスの配列の名前を y から z に変更しました。

編集: 4D の例:

a = np.zeros((2,3,4,5))
z = sp.stats.distributions.randint.rvs(0, 4, size=(2,3))
w = sp.stats.distributions.randint.rvs(0, 5, size=(2,3))

xx, yy = np.meshgrid( np.arange(2), np.arange(3) )
a[ xx, yy, z[xx, yy], w[xx, yy] ] = 1
于 2012-11-27T22:33:59.467 に答える
0
x = np.zeros((2,3,4))
y=np.array([[2, 1, 0],[3, 2, 0]]) # or y=sp.stats...
for i in range(2):
    for j in range(3):
        x[i,j,y[i,j]]=1

目的の結果、IIRC が生成されます。配列の次元が変わらない場合は、2 つの for ループとその負荷を次のように置き換えることを検討してください。

for j in range(3):
    x[0,j,y[0,j]] = x[1,j,y[1,j]] = 1
于 2012-11-27T21:56:38.180 に答える