在Python / Numba中访问数组会产生奇怪的结果

时间:2014-01-31 01:29:12

标签: python numpy casting numba

我正在尝试使用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 ++时,这是一个问题吗?

谢谢你的帮助

1 个答案:

答案 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)写入tabletable将数据视为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)