Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Numpy将数组从浮点转换为字符串_Python_Numpy_Matplotlib - Fatal编程技术网

Python Numpy将数组从浮点转换为字符串

Python Numpy将数组从浮点转换为字符串,python,numpy,matplotlib,Python,Numpy,Matplotlib,我有一个浮点数数组,我已经将其归一化为1(即数组中最大的数字是1),我想将其用作图形的颜色索引。在使用matplotlib使用灰度时,这需要使用介于0和1之间的字符串,因此我想将浮点数组转换为字符串数组。我试图通过使用“astype('str')”来实现这一点,但这似乎创建了一些与原始值不同(甚至不接近)的值 我注意到这一点,因为matplotlib抱怨在数组中查找数字8,这是奇数,因为它被归一化为1 简言之,我有一个float64的数组phis,这样: numpy.where(phis.ast

我有一个浮点数数组,我已经将其归一化为1(即数组中最大的数字是1),我想将其用作图形的颜色索引。在使用matplotlib使用灰度时,这需要使用介于0和1之间的字符串,因此我想将浮点数组转换为字符串数组。我试图通过使用“astype('str')”来实现这一点,但这似乎创建了一些与原始值不同(甚至不接近)的值

我注意到这一点,因为matplotlib抱怨在数组中查找数字8,这是奇数,因为它被归一化为1

简言之,我有一个float64的数组phis,这样:

numpy.where(phis.astype('str').astype('float64') != phis)
是非空的。这是令人费解的(希望是天真的),因为它似乎是numpy中的一个bug,是否有任何我可能做了错事导致这一点

编辑:调查后,这似乎是由于字符串函数处理高精度浮点的方式造成的。使用矢量化toString函数(如robbles answer中所述),情况也是如此,但是如果lambda函数为:

lambda x: "%.2f" % x

然后作图工作——好奇者和好奇者。(显然,数组不再相等!)

如果您有一个由
数字组成的数组,并且需要一个由
字符串组成的数组,您可以编写:

strings = ["%.2f" % number for number in numbers]
如果您的数字是浮点数,那么该数组将是一个数字与两位小数的字符串相同的数组

>>> a = [1,2,3,4,5]
>>> min_a, max_a = min(a), max(a)
>>> a_normalized = [float(x-min_a)/(max_a-min_a) for x in a]
>>> a_normalized
[0.0, 0.25, 0.5, 0.75, 1.0]
>>> a_strings = ["%.2f" % x for x in a_normalized]
>>> a_strings
['0.00', '0.25', '0.50', '0.75', '1.00']
请注意,它也适用于
numpy
数组:

>>> a = numpy.array([0.0, 0.25, 0.75, 1.0])
>>> print ["%.2f" % x for x in a]
['0.00', '0.25', '0.50', '0.75', '1.00']
如果您有多维数组,则可以使用类似的方法:

new_array = numpy.array(["%.2f" % x for x in old_array.reshape(old_array.size)])
new_array = new_array.reshape(old_array.shape)
例如:

>>> x = numpy.array([[0,0.1,0.2],[0.3,0.4,0.5],[0.6, 0.7, 0.8]])
>>> y = numpy.array(["%.2f" % w for w in x.reshape(x.size)])
>>> y = y.reshape(x.shape)
>>> print y
[['0.00' '0.10' '0.20']
 ['0.30' '0.40' '0.50']
 ['0.60' '0.70' '0.80']]
如果您检查,您会注意到他们使用了类似的方法:构建空矩阵,并用插值方法构建的字符串填充它。参考规范的相关部分为:

colortuple = ('y', 'b')
colors = np.empty(X.shape, dtype=str)
for y in range(ylen):
    for x in range(xlen):
        colors[x, y] = colortuple[(x + y) % len(colortuple)]

surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, facecolors=colors,
        linewidth=0, antialiased=False)

这可能比您想要的慢,但您可以:

>>> tostring = vectorize(lambda x: str(x))
>>> numpy.where(tostring(phis).astype('float64') != phis)
(array([], dtype=int64),)

当它从float64转换为str时,它看起来会对值进行舍入,但通过这种方式,您可以根据自己的喜好自定义转换。

如果主要问题是从float转换为字符串时精度降低,一种可能的方法是将float转换为十进制


在Python2.7及更高版本中,您可以直接将浮点转换为
十进制对象。

对于numpy数组在幕后的工作方式,您似乎有点困惑。数组中的每个项的大小必须相同

浮点数的字符串表示形式不是这样工作的。例如,
repr(1.3)
产生
'1.3'
,但
repr(1.33)
产生
'1.330000000000001'

浮点数的精确字符串表示将生成长度可变的字符串

由于numpy数组由大小相同的元素组成,因此在使用字符串数组时,numpy要求您指定数组中字符串的长度

如果使用
x.astype('str')
,它将始终将内容转换为长度为1的字符串数组

例如,使用
x=np.array(1.344566)
x.astype('str')
产生
'1'

您需要更明确地使用
“|Sx”
dtype语法,其中
x
是数组中每个元素的字符串长度

例如,使用
x.astype('| S10')
将数组转换为长度为10的字符串


更好的方法是,避免使用字符串的numpy数组。这通常是个坏主意,从您对问题的描述中,我看不出有理由首先使用它们……

这不是问题所在。您正在创建一个
列表
,他想要一个numpy数组。如果不清楚,我很抱歉,但我处理的是numpy数组,而不是python列表。更重要的是,我的数组是二维的,所以1dim列表理解是不可行的。我完全知道我可以创建一个中间python列表,然后转换成一个numpy数组,但是上面的方法似乎可以工作,而且使用中间列表编程非常(缓慢)。如果可以迭代对象(如列表或numpy数组),它支持列表理解。它不需要是一个列表(duck类型)是的,但是你没有得到一个numpy数组,是吗?Arrieta:这不起作用,因为当使用多维数组时,列表理解将迭代numpy.ndarrays,而不是单个数字。这也不起作用,这导致我建议将非常小的数字转换为字符串,失败?也就是说,数组包含10^-30阶的数字。你的意思是得到不同的结果?我刚刚用一个小的2D数组尝试了一下,它成功了——也许是个bug……好吧,现在我看到了同样的东西,用非常小的数字。也许这是一个普通的浮点数学问题?我确实得到了一个不同的结果,但也许限制不是由于数字的数量级,而是精度的程度?(虽然在科学记数法中有描述)。编辑:如果是浮点问题,什么样的浮点错误会将远小于1的数字误认为8左右的数字?Hahaha使用字符串numpy数组的理由是因为matplotlib需要一个形状正确的iterable字符串,它表示0到1之间的数字,以表示灰度(我当时想要的)。将我拥有的数字数组转换为字符串数组似乎是最容易的。我没有预料到长度的复杂性。在这种情况下也很有用:1)从文件中读取数据2。)假设所有条目都是
float
,但是,有些条目是
nan
。3.)如果所有变量都被读取为浮点值,列表中将有
double64
变量显示为
nan
,但没有被识别为
numpy.nan
4。)为了替换这些变量,我成功地使用了:
if V[-1]。astype(“| S3')='nan”:V[-1]=numpy.nan
您可以使用np.genfromtxt并处理(或多或少)自动地将浮动转换为strin总是一个坏主意