gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:51:30 24 4
gpt4 key购买 nike

我正在尝试将 numpy 与 numba 一起使用,但在尝试使用转换为 int 的浮点索引访问或将某些值设置为 numpy float 组时,我得到了奇怪的结果。检查这个基本功能。

@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++ 解析类型时是否有问题?

谢谢你的帮助

最佳答案

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)

关于python - 在 Python/Numba 中访问数组会产生奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21470950/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com