簡體   English   中英

python與numpy移位

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM