用numpython进行位移位

用numpython进行位移位,python,numpy,Python,Numpy,我处理的是64位无符号整数,在位移位后,在解码其余的位值之前比较值。 我迭代了数百万个值,并试图将处理时间减到最少 问题是uint64或numpy-uint64不支持位移位。我试图避免使用int64来避免负值 示例数据: 0x8204000000000080 移位后(word>>60):=-8#但与0x8比较 循环一百万次,看看需要多长时间,我们发现在所有方法中,“>>”移位运算符是最方便的,其次是调用abs()函数。有没有更好更方便的解决办法 循环代码: import numpy as np

我处理的是64位无符号整数,在位移位后,在解码其余的位值之前比较值。 我迭代了数百万个值,并试图将处理时间减到最少

问题是uint64或numpy-uint64不支持位移位。我试图避免使用int64来避免负值

示例数据: 0x8204000000000080 移位后(word>>60):=-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尝试生成一个输出类型,该类型可以保存两个输入数据类型的所有值(Python int强制转换为int32或int64)。没有可以同时保存uint64和有符号数据类型的所有值的整数数据类型,并且这里不允许使用浮点

当一个操作数是数组,另一个是标量(此处为Python int)时,对于大多数移位操作,这意味着移位量被转换为int 8或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
>>numpy.uint64(-1)>>1
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:输入类型和输入不支持ufunc“右移位”
无法根据强制转换规则安全地强制为任何受支持的类型
e“安全”
>>>numpy.uint64(-1)>>numpy.uint64(1)
9223372036854775807

为什么您说不支持换档?因为它完全是。也许是打字错误。uint64类型似乎保留在响应中。在输出中,它似乎将您的数据类型转换为int64。我的数据无法转换为int64,因为它会丢失信息。int64的最大可能正数是2^63-1,而uint64的最大可能正数是2^64。我的数据包含此范围内的数字。这不是一个输入错误,它仍然是uint64(我最初使用int64,因为我误读了原始语句,并且在更改为uint时没有更正输出)。错误:TypeError:ufunc“right_shift”不支持输入类型,并且,根据引发错误的强制转换规则“安全”类型:操作,无法将输入安全强制为任何受支持的类型:(data\u word>>60)hmmm您使用的python版本是什么?在python2.6和numpy 1.9.0ahh中,这对我来说似乎很好。。。不确定为什么它对我来说在旧版python和旧版numpy中工作得很好:P(+1,因为您可以复制原始版本),那么对于使用数组标量的所有操作,情况都是一样的吗?对于位&有必要:data\u word&np.uint64(mask)感谢您的反馈,它回答了我的问题。
>>> 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