gpt4 book ai didi

python - 在 db 中存储为字符串后检索相等的 numpy 数组

转载 作者:太空宇宙 更新时间:2023-11-03 22:11:20 25 4
gpt4 key购买 nike

我有一个从查询图像中提取的 numpy.float32 元素列表:

[0.013991388, 0.0070270086, 0.0012525863, 0.013302466, . . . etc

这存储在对象中,也作为字符串存储在数据库中。然后将对象值与检索到的数据库值进行比较(当然是在从字符串转换之后)。

然而,无论它们看起来多么相似,我似乎都无法让它们再次相等。例如,我正在运行 chi2 距离算法来计算距离,并期望能够为同一图像返回 0.0。

我的转化码:

# converts string to numpy array (matrix). MUST CAST to float32 otherwise pythons float64 by default, this will not
# match with our query array even if they are the same image!!!
def toMatrix(text):
text = text.replace('[', '').replace(']', '')
floats = [np.float32(x) for x in text.split(',')]

return floats

在将字符串转换回上面的 float 列表后,我将它与存储在对象中的列表进行比较,方法是将一个接一个地粘贴到 PyCharm 文本文件中。检查本地历史记录表明没有发生任何变化,并且在视觉上这两个数组是相同的。

所以我认为这是一个类型问题。我打印出两个列表第一个元素的类型,例如type(listA[0]), type(listB[0])并且都是 numpy.float32。

所以我使用更一般的比较:

np.array_equal(listA, listB) # returns False
np.allclose(listA, listB) # returns True

试图找出不相等的东西:

d = {}
count = 1
for item in listA:
if item not in listB:
d[count] = type(item)
count += 1

我得到了奇怪的结果:{124: <class 'numpy.float32'>}

哪个是两个数组中的单个项目???

谁能阐明到底发生了什么以及我如何才能使数组相等?

最佳答案

数字的字符串表示形式有 8 位有效数字; this is not enough to uniquely specify the binary representationfloat32

  • 您永远不应该假设 float(string(number))==number 用于 float 。在制作 float 的字符串表示时有足够多的流浪,如果尝试了足够多的次数,这注定会失败。

  • 如果您确实需要两个数字按位相等(通常在创建字符串表示时不能保留),则您应该只测试 float 之间的相等性。通常情况下,您想要的是 numpy.allclose 使用的“公差范围内相等”标准。

如果您的情况允许,您应该考虑以二进制格式保存数据数组。这将在保存/加载过程中保留数字的位表示(如果您真的关心按位相等),作为一个额外的好处,这需要更少的存储空间。

您遇到了浮点精度问题:字符串表示与二进制表示不同。试试这个:

import numpy as np
import random
a=random.random()
np.float32( str(a)) == a

我第一次尝试时得到了 False (print a => 0.893117245932),也许你不会,但是有 float ,其中 float( string(number)) 不是那个数字。

如果你需要将它们保存为字符串,你应该使用numpy.tostring -- 这将从数组中的值生成一个二进制字符串,这样 numpy.fromstring(numpy.tostring(array), dtype=numpy.float32) == array (假设 array.dtype==numpy.float32).

如果您不关心精度,那么使用公差测试近似相等性(如 allclose 中所用)可能有意义。

关于python - 在 db 中存储为字符串后检索相等的 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35300366/

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