我有一个 float 组,我已经标准化为一个(即数组中的最大数字是 1),我想用它作为图表的颜色索引。在使用 matplotlib 使用灰度时,这需要使用 0 到 1 之间的字符串,所以我想将 float 组转换为字符串数组。我试图通过使用“astype('str')”来做到这一点,但这似乎会创建一些与原始值不同(甚至接近)的值。
我注意到这一点是因为 matplotlib 提示在数组中找到数字 8,这很奇怪,因为它被归一化为 1!
简而言之,我有一个 float64 的数组 phi,这样:
numpy.where(phis.astype('str').astype('float64') != phis)
不为空。这令人费解,因为(希望天真地)它似乎是 numpy 中的一个错误,有什么我可能做错了导致这种情况吗?
编辑:经过调查,这似乎是由于字符串函数处理高精度 float 的方式。使用矢量化的 toString 函数(来自 robbles 的答案),情况也是如此,但是如果 lambda 函数是:
lambda x: "%.2f" % x
然后绘图工作 - 越来越好奇。 (显然数组不再相等!)
最佳答案
您似乎对 numpy 数组如何在幕后工作感到有些困惑。数组中的每一项都必须大小相同。
float 的字符串表示不能以这种方式工作。例如,repr(1.3)
产生 '1.3'
,但 repr(1.33)
产生 '1.3300000000000001'
。
float 的精确字符串表示会产生一个可变长度字符串。
因为 numpy 数组由大小相同的元素组成,所以 numpy 要求您在使用字符串数组时指定数组中字符串的长度。
如果你使用 x.astype('str')
,它总是会将事物转换为长度为 1 的字符串数组。
例如,使用 x = np.array(1.344566)
,x.astype('str')
产生 '1'
!
您需要更加明确并使用 '|Sx'
dtype 语法,其中 x
是数组中每个元素的字符串长度。
例如,使用 x.astype('|S10')
将数组转换为长度为 10 的字符串。
更好的是,完全避免使用 numpy 字符串数组。这通常是个坏主意,从您对问题的描述中,我没有理由首先使用它们...
关于python - Numpy 将数组从 float 转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5365520/