python使用numpy进行位移位

1aaf6o9v  于 2023-06-06  发布在  Python
关注(0)|答案(2)|浏览(237)

我使用的是64位无符号整数,经过位移位后,在解码其余位值之前比较值。我正在迭代数百万个值,并试图最小化处理时间。
问题是uint 64和numpy-uint 64都不支持位移位。我试图避免使用int 64来避免负值。
示例数据:0x 820400000000080移位后(字>> 60):=-8 #但与0x 8比较
循环100万次并观察花费多长时间,发现在所有方法中,‘>>’移位运算符是最方便的,具有调用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
hfwmuf9z

hfwmuf9z1#

问题是,当你将移位应用于数组标量时,NumPy试图生成一个可以保存两个输入数据类型的所有值的输出类型(使用Python int转换为int32或int64)。没有一个整型的dtype可以同时包含uint64和有符号的dtype的所有值,浮点数在这里也不是一个选项。
当一个操作数是数组,另一个是标量(这里是Python int)时,NumPy试图将标量填充到更小的dtype中,对于大多数移位操作来说,这意味着移位量被转换为int8或uint8,这取决于另一个操作数是否有符号。uint64和uint8都适合于uint64。
你必须将移位量转换为一个unsigned int:

>>> 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
68bkxrlz

68bkxrlz2#

>>> 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)

也许我不明白这个问题?

相关问题