5

私はナイーブなnumpyユーザーです。次の問題について、あなたの助けが必要です。2番目の配列よりも小さい多次元配列のいくつかの要素を3番目の配列に置き換えたい。例えば:

x = np.arange(16).reshape((2, 8)) 
# x = np.array([[ 0,  1,  2,  3,  4,  5,  6,  7],
#               [ 8,  9, 10, 11, 12, 13, 14, 15]])

y = np.array([[2], [13]])
# y = np.array([[ 2], [13]])

xここで、がより大きい場所を見つけ、配列にy少なくとも1つある場合は、これらのインスタンスをカウントし、別の配列()を作成して、これらの要素を次のように置き換えます。Truex > yzxz

x > y 
# = [[False, False, False, True,  True,  True,  True, True],
#    [False, False, False, False, False, False, True, True]]

この場合、xx[:,3:])の5つの要素を置き換える必要があるため、(5, 2)配列を作成します。

z = np.array([[20,21],[22,23],[24,25],[26,27],[28,29]])

私が欲しい結果は

x == np.array([[ 0,  1,  2, 20, 22, 24, 26, 28],
               [ 8,  9, 10, 21, 23, 25, 27, 29]])
4

1 に答える 1

4

あなたが望むことをほぼ正確に行うnumpy関数は次のとおりです:numpy.where

x = np.arange(16).reshape((2, 8))
y = np.array([[2], [13]])
z = np.arange(16, 32).reshape((2, 8))
numpy.where(~(x > y).any(axis=0), x, z)

結果:

array([[ 0,  1,  2, 19, 20, 21, 22, 23],
       [ 8,  9, 10, 27, 28, 29, 30, 31]])

これとあなたが求めたものとの唯一の違いはz、と同じ形に放送可能でなければならないということですx。の値と同じ数の列のみを含む値を絶対使用する必要がない限り、これが最善のアプローチだと思います。zTrue~(x > y).any(axis=0)

zただし、コメントを踏まえると、上記の値を使用する必要があるようです。関数は形状が一致することを保証しているように思われるので、おそらくこれを行うことができます:

x[:,(x > y).any(axis=0)] = z.T

テスト済み:

>>> z = np.arange(20, 30).reshape((5, 2))
>>> x[:,(x > y).any(axis=0)] = z.T
>>> x
array([[ 0,  1,  2, 20, 22, 24, 26, 28],
       [ 8,  9, 10, 21, 23, 25, 27, 29]])
于 2012-07-13T11:15:03.347 に答える