6

配列が与えられると、

>>> n = 2
>>> a = numpy.array([[[1,1,1],[1,2,3],[1,3,4]]]*n)
>>> a
array([[[1, 1, 1],
        [1, 2, 3],
        [1, 3, 4]],

       [[1, 1, 1],
        [1, 2, 3],
        [1, 3, 4]]])

その中の値をそのように簡潔に置き換えることが可能であることを私は知っています、

>>> a[a==2] = 0
>>> a
array([[[1, 1, 1],
        [1, 0, 3],
        [1, 3, 4]],

       [[1, 1, 1],
        [1, 0, 3],
        [1, 3, 4]]])

配列の行全体(最後の軸)に対して同じことを行うことは可能ですか?これでうまくいき、一致するサブアレイのすべての要素が11に置き換えられることはわかっていa[a==[1,2,3]] = 11ますが、別のサブアレイに置き換えたいと思います。私の直感では、次のように書くように言われていますが、エラーが発生します。

>>> a[a==[1,2,3]] = [11,22,33]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: array is not broadcastable to correct shape

要約すると、私が取得したいのは次のとおりです。

array([[[1, 1, 1],
        [11, 22, 33],
        [1, 3, 4]],

       [[1, 1, 1],
        [11, 22, 33],
        [1, 3, 4]]])

...そしてもちろんnは一般に2よりもはるかに大きく、他の軸も3よりも大きいので、必要がなければループしたくありません。


更新:([1,2,3]または私が探している他のもの)は常にインデックス1にあるとは限りません。例:

a = numpy.array([[[1,1,1],[1,2,3],[1,3,4]], [[1,2,3],[1,1,1],[1,3,4]]])
4

3 に答える 3

3

np.allこれは、すべての列にTrue比較用の値があるかどうかを確認し、作成されたマスクを使用して値を置き換えることで、はるかに高いパフォーマンスで実現できます。

mask = np.all(a==[1,2,3], axis=2)
a[mask] = [11, 22, 23]

print(a)
#array([[[ 1,  1,  1],
#        [11, 22, 33],
#        [ 1,  3,  4]],
# 
#       [[ 1,  1,  1],
#        [11, 22, 33],
#        [ 1,  3,  4]]])
于 2014-03-23T12:05:51.350 に答える
2

あなたはあなたが望むものを達成するためにもう少し複雑なことをしなければなりません。

配列のスライス自体を選択することはできませんが、必要な特定のインデックスをすべて選択することはできます。

したがって、最初に、選択する行を表す配列を作成する必要があります。すなわち。

data = numpy.array([[1,2,3],[55,56,57],[1,2,3]])

to_select = numpy.array([1,2,3]*3).reshape(3,3) # three rows of [1,2,3]

selected_indices = data == to_select
# array([[ True,  True,  True],
#        [False, False, False],
#        [ True,  True,  True]], dtype=bool)

data = numpy.where(selected_indices, [4,5,6], data)
# array([[4, 5, 6],
#        [55, 56, 57],
#        [4, 5, 6]])

# done in one step, but perhaps not very clear as to its intent
data = numpy.where(data == numpy.array([1,2,3]*3).reshape(3,3), [4,5,6], data)

numpy.wheretrueの場合は2番目の引数から、falseの場合は3番目の引数から選択することで機能します。

3種類のデータからどこから選択するかを使用できます。1つ目は、と同じ形状の配列でselected_indices、2つ目はそれ自体の値(2や7など)です。1つ目は、と同じ形状にブロードキャストできる形状である可能性があるため、最も複雑selected_indicesです。この場合[1,2,3]、3x3の形状の配列を取得するために一緒に積み重ねることができるものを提供しました。

于 2012-06-05T09:26:59.490 に答える
0

これが必要な場合は、コード例で指定した配列が作成されないことに注意してください。だが:

>>> a = np.array([[[1,1,1],[1,2,3],[1,3,4]], [[1,1,1],[1,2,3],[1,3,4]]])
>>> a
array([[[1, 1, 1],
        [1, 2, 3],
        [1, 3, 4]],

       [[1, 1, 1],
        [1, 2, 3],
        [1, 3, 4]]])
>>> a[:,1,:] = [[8, 8, 8], [8,8,8]]
>>> a
array([[[1, 1, 1],
        [8, 8, 8],
        [1, 3, 4]],

       [[1, 1, 1],
        [8, 8, 8],
        [1, 3, 4]]])
>>> a[:,1,:] = [88, 88, 88]
>>> a
array([[[ 1,  1,  1],
        [88, 88, 88],
        [ 1,  3,  4]],

       [[ 1,  1,  1],
        [88, 88, 88],
        [ 1,  3,  4]]])
于 2012-06-05T08:39:28.570 に答える