我正在尝试使用numby与numba,但是当我尝试使用转换为int的float索引访问或设置一些numpy数组的浮点时,我得到了奇怪的结果。 检查这个基本功能。
@numba.jit("void(f8[:,::1],f8[:,::1])")
def test(table, index):
x,y = int(index[0,0]), int(index[1,0)
table[y,x] = 1.0
print index[0,0], index[1,0], x,y
print table
print table[y,x]
table = np.zeros((5,5), dtype = np.float32)
index = np.random.ranf(((2,2)))*5
test(table, index)
结果:
index[0,0] = 1.34129550525 index[1,0] = 0.0656177324359 x = 1 y = 0
table[0,1] = 1.0
table [[ 0. 0. 1.875 0. 0. ]
[ 0. 0. 0. 0. 0. ]
[ 0. 0. 0. 0. 0. ]
[ 0. 0. 0. 0. 0. ]
[ 0. 0. 0. 0. 0. ]]
为什么我的桌子上有1.875而不是1.0?这是一个基本的例子,但我正在使用大数组,它给了我很多错误。我知道我可以将索引转换为 np.int32 并更改 @ numba.jit(“void(f8 [:,:: 1],f8 [:,:: 1])”) 到 @ numba.jit(“void(f8 [:,:: 1],i4 [:,:: 1])”)这个工作正常,但我会像吨了解为什么这不起作用。 将类型从python解析为c ++时,这是一个问题吗?
谢谢你的帮助
答案 0 :(得分:4)
In [198]: np.float64(1.0).view((np.float32,2))
Out[198]: array([ 0. , 1.875], dtype=float32)
所以当
table[y,x] = 1.0
将np.float64(1.0)
写入table
,table
将数据视为np.float32
,并将其解释为0和1.875。
请注意,0显示在索引位置[0,1]
,1.875
显示在索引位置[0,2]
,而分配则显示在[y,x] = [0,1]
。
您可以通过更改
来修复dtype不匹配问题@numba.jit("void(f8[:,::1],f8[:,::1])")
到
@numba.jit("void(f4[:,::1],f8[:,::1])")
这些是np.float64(1.0)
中的8个字节:
In [201]: np.float64(1.0).tostring()
Out[201]: '\x00\x00\x00\x00\x00\x00\xf0?'
当4字节'\x00\x00\xf0?'
被解释为np.float32
时,你得到1.875:
In [205]: np.fromstring('\x00\x00\xf0?', dtype='float32')
Out[205]: array([ 1.875], dtype=float32)