我想与numba使用numpy,但我得到奇怪的结果,同时尝试访问或设置一些值为浮点型数组使用浮点型索引转换为int 。 检查这个基本功能。在Python/Numba中访问数组给出奇怪的结果
@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++时它是一个问题?
感谢您帮助
没有在JIT的F8声明和初始化np.float32之间的差异? 1.875不在x = 1处。 顺便说一句,为什么它被标记为C++? – Joky
@Joky C++标签是一个错误的抱歉。是的,它与np.float64一起工作。 但对于像1.0这样的数字应该浮动32或浮动64有所作为? –
既然您标记了C++;):问题是该表是一个指向double的指针,指向一个float数组。在位置1重叠位置3/4的浮点数(2倍大)和在两个浮点数上的双精度编码没有任何意义。顺便说一句,这是一个猜测,因为我不知道什么是numba生成的代码。编辑:unutbu下面解释清楚。 – Joky