2017-04-06 6 views
1

与えられた2 numpy.ndarray私はarray1の2LSBをarray2に設定したいと思います。バイナリでナンシービット操作

array1 = [1, 2, 3, 4, 5] 
array2 = [4, 3, 4] 

を、このように表すことができる:

array1 = [00000001, 00000010, 00000011, 00000100] 
array2 = [00000100, 00000011, 00000100] 

今配列1に2LSBの配列2のを設定した後、新しい配列がある:

私は使用することができます
newArray = [00000000, 00000011, 00000000, 00000100] 

明確にする 配列をバイナリ表現に変換するnp.unpackbits。しかし、array1の上位6ビットを変更せずに、array1の最後の2ビットをどのように変更するだけですか?

+1

'array1'のバイナリ表現に" 5 "がありません。 – kennytm

答えて

1

と同じ形状になるように、最初にarray2のサイズを変更する必要があります。

# mutates array2 in-place 
array2.resize(array1.shape) 

# or, if array2 is never longer than array1 
array2 = numpy.pad(array2, (0, len(array1) - len(array2)), 'constant') 

次に、standard bit manipulation methodsを使用して最後の2ビットをコピーします。

(array1 & ~3) | (array2 & 3) 
0

ケンニットの答えは、しかし、ここでは、あなたが始まっていた配列ルートに行く別のアプローチがあります。

a = np.array([[1], [2], [3], [4], [5]], dtype=np.uint8) 
b = np.array([[4], [3], [4]], dtype=np.uint8) 
au = np.unpackbits(a, axis=1) 
bu = np.unpackbits(b, axis=1) 
nu = au 

for i in range(0, len(nu)): 
    if len(bu) > i: 
     nu[i][-2] = bu[i][-2] 
     nu[i][-1] = bu[i][-1] 

print(nu) 

プレーンビット演算で

[[0 0 0 0 0 0 0 0] 
[0 0 0 0 0 0 1 1] 
[0 0 0 0 0 0 0 0] 
[0 0 0 0 0 1 0 0] 
[0 0 0 0 0 1 0 1]] 
0

をもたらし、これは、あなたがそれを行うことができる方法です。

array1 = [00000001, 00000010, 00000011, 00000100] 
array2 = [00000100, 00000011, 00000100] 

array2の最初のインデックスを取得します。

array2[0] = 00000100 

次のようになります。今

result = array2[0] << 6 
result >>>= 6 (Unsigned, since we don't care about sign here) 

、次のようになります。

result2 = array1[0] >>> 2 
result2 <<= 2 

そして:あなたの与えられたデータに対して説明するための

result1 | result2 

を、私はします両方の配列のインデックス1に適用します。

だから、
array2[1] = 00000011 

、今

00000011 << 6 will give 11000000 

まず、結果の符号なし右シフトを適用します。配列1に適用

11000000 >>> 6 will give 00000011 

[1]

00000010 >>> 2 will give 0000 0000 

0000 0000 << 2 will give 0000 0000 

array1[1] = 00000010 

ので、適用| 2つの結果

0000 0000 | 0000 0011 will give 0000 0011 

あなたは二回、なぜ実行操作を不思議に思われるかもしれません

説明?たとえば、array2では、最初に6ビットの左シフトを実行し、次に6ビットの符号なし右シフトを実行しましたか? 6ビットの

左シフトは、私たちは、この操作のためにそれらを必要としない、ため、配列2内の他のすべてのビットを削除します(私たちはそれらのビットだったものは何でも構いません)

6ビットの符号なし右シフト再び意志array2の最後の2ビットを通常の位置に戻します。これがすべて最終結果にとって重要です。

次に、array1の2ビットの符号なし右シフトが最後の2ビットをドロップし、2ビットの左シフトを再び適用すると0に設定され、OR'ing(|)によって最後の2ビットが追加されます最終的な結果。