我在Python2.7中使用以下功能:
def array2int(pixels):
out = 0
for bit in pixels:
out = (out << 1) | bit
return out
这通常有效,但如果我通过
v=np.array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 0, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
array2int(v.astype(int))
返回-262145
。
答案 0 :(得分:3)
与Python不同,numpy默认使用固定大小的整数。那些可能会溢出:
1<<65
# 36893488147419103232 # correct
npone = np.ones([1], dtype=int)[0]
npone
# 1
type(npone)
# <class 'numpy.int64'>
npone<<65
# 2 # wrong
当添加或按位oring或者任何python int和numpy int时,numpy通常会获胜并且结果将是一个numpy int:
out = 1
type(out)
# <class 'int'>
out = (out << 1) | npone
type(out)
# <class 'numpy.int64'>
为了防止在您的功能中发生这种情况,您可以明确地将bit
投射到正确的int
:
out = (out << 1) | int(bit)