[英]python bit shifting with numpy
我正在使用64位無符號整數,並且在對位進行了移位后比較了該值,然后再解碼其余的位值。 我正在遍歷數百萬個值,並試圖減少處理時間。
問題是uint64或numpy-uint64不支持移位。 我試圖避免使用int64來避免出現負值。
示例數據:移位后(word >> 60)為0x8204000000000080:= -8#但與0x8比較
循環一百萬次並查看需要花費多長時間,發現在所有方法中,“ >>”移位運算符是最方便的,其次是調用abs()函數的最佳選擇。 是否有更好,更方便的解決方案?
循環碼:
import numpy as np
import time
start_time= time.time()
for i in range(1000000):
x= np.int64(-1)
x=np.right_shift(x,60)
print (time.time()-start_time)
start_time= time.time()
for i in range(1000000):
x= np.uint64(-1)
x=int(x/(2**60))
print (time.time()-start_time)
start_time= time.time()
for i in range(1000000):
x= np.int64(-1)
x=abs(x>>60)
print (time.time()-start_time)
start_time= time.time()
for i in range(1000000):
x= np.int64(-1)
x= x>>60
print (time.time()-start_time)
輸出:
2.055999994277954
3.1540000438690186
0.619999885559082
0.5810000896453857
問題是,當您將偏移應用於數組標量時,NumPy嘗試生成可容納兩個輸入dtype的所有值的輸出類型(將Python int強制轉換為int32或int64)。 沒有可以容納uint64和帶符號dtype的所有值的整數dtype,並且在這里不是浮點數的選擇。
當一個操作數是數組而另一個是標量(此處為Python int)時, NumPy嘗試將標量填充為較小的dtype ,對於大多數移位操作,這意味着將移位量強制轉換為int8或uint8,具體取決於其他操作數已簽名。 uint64和uint8都適合uint64。
您必須將偏移量轉換為無符號整數:
>>> numpy.uint64(-1) >> 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: ufunc 'right_shift' not supported for the input types, and the inputs
could not be safely coerced to any supported types according to the casting rul
e ''safe''
>>> numpy.uint64(-1) >> numpy.uint64(1)
9223372036854775807
>>> import numpy
>>> a = numpy.array([1,2,3],dtype=numpy.uint64)
>>> a>>2
array([0, 0, 0], dtype=uint64)
>>> a = numpy.array([1,2,2**64-1],dtype=numpy.uint64)
>>> a>>2
array([0, 0, 4611686018427387903], dtype=uint64)
>>> a>>60
array([ 0, 0, 15], dtype=uint64)
我可能不明白這個問題?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.