numpy将数组从浮点数转换为字符串
我有一个标准化的浮点数数组(即数组中最大的数字是1),我想将其用作图形的颜色索引。在使用matplotlib使用灰度时,这需要使用0到1之间的字符串,因此我想将float数组转换为字符串数组。我试图通过使用“
astype(’str’)”来执行此操作,但这似乎会创建一些与原始值不相同(甚至接近)的值。
我注意到这一点是因为matplotlib抱怨在数组中找到数字8,这很奇怪,因为它被标准化为1!
简而言之,我有一个float64的数组phis:
numpy.where(phis.astype('str').astype('float64') != phis)
不为空。这令人费解,因为(希望是天真的)它似乎是numpy中的错误,我是否可能做错了什么导致此错误?
编辑:经过调查,这似乎是由于字符串函数处理高精度浮点的方式所致。使用向量化的toString函数(从robbles回答),情况也是如此,但是,如果lambda函数为:
lambda x: "%.2f" % x
然后图表开始工作-越来越好奇。(显然,数组不再相等!)
-
您对numpy数组在后台如何工作感到有些困惑。数组中的每个项目都必须具有 相同的大小 。
浮点数的字符串表示无法通过这种方式工作。例如,
repr(1.3)
yields'1.3'
,但是repr(1.33)
yields
'1.3300000000000001'
。浮点数的准确字符串表示形式会生成 可变长度的 字符串。
由于numpy数组由大小均相同的元素组成,因此numpy要求您在使用字符串数组时指定数组中字符串的长度。
如果使用
x.astype('str')
,它将始终将内容转换为长度为1的字符串数组。例如,使用
x = np.array(1.344566)
,会x.astype('str')
产生'1'
!您需要更明确地使用
'|Sx'
dtype语法,其中dx
是数组中每个元素的字符串长度。例如,用于
x.astype('|S10')
将数组转换为长度为10的字符串。更好的是,避免完全使用字符串的numpy数组。通常这是一个坏主意,从您对问题的描述中我看不出要首先使用它们的理由…