2

だから、これはかなり簡単なはずですが、私にとっては膨大な時間がかかるようです.2つの値(例0と255)しかないnumpy配列があり、そのように行列を反転させたい、すべての値が入れ替わること (0 が 255 になり、その逆)。行列は約 2000³ のエントリなので、これは大変な作業です。最初に numpy.invert メソッドを試しましたが、これは私が期待したものとはまったく異なります。そこで、値を「保存」してからオーバーライドすることで、自分でそれをやろうとしました:

for i in range(array.length):
            array[i][array[i]==255]=1
            array[i][array[i]==0]=255
            array[i][array[i]==1]=0

これは期待どおりに動作していますが、時間がかかります (for ループが原因だと思いますか?)。すべてのスレッドがより小さなサブ配列を「反転」するマルチスレッド計算としてそれを実装すると、それはより高速になりますか? または、より便利にそれを行う別の方法はありますか?

4

4 に答える 4

4

0 と 255 を入れ替えるには、データ型が整数型の場合は XOR を使用できます。

array ^= 255
于 2013-04-09T12:02:47.850 に答える
4

あなたは簡単に行うことができます:

arr_inverted = 255-arr

これは、すべての要素を 1 つずつ変換します (255 は 0 を、0 は 255 を返します)。より一般的には、a と b の 2 つの値しかない場合、「反転」は単純に で行われ(a+b)-arrます。これは、2 つの値が整数でない場合(浮動小数点数や複素数など) にも機能します。

ハイメが指摘したように、メモリが問題になる場合は、インプレースsubtract(255, arr, out=arr)の値をスワップします。arr

より一般的に配列に整数がある場合、Janne Karila の XOR インプレース ソリューションには、上記で提案された違いのインプレース ソリューションよりも簡潔であるという利点があります。2 つの整数とarr ^= (a^b)を交換するため、として一般化できます。ab

実行時間は両方の方法で似ています (200×200×200 のuint8整数配列を IPython で):

>>> arr = np.random.choice((0, 255), (200, 200, 200)).astype('uint8')
>>> %timeit np.bitwise_xor(255, arr, out=arr)
100 loops, best of 3: 7.65 ms per loop
>>> %timeit np.subtract(255, arr, out=arr)
100 loops, best of 3: 7.69 ms per loop

配列のタイプuint8がである場合、 arr_inverted = ~a0 と 255 を交換するのに同じ時間がかかり (~演算子はすべてのビットを反転します)、あまり一般的ではないため、価値がありません (200×200×200 配列でテスト)。

于 2013-04-09T12:13:28.650 に答える