Python:将字符串转换为浮点数,将浮点数读入2D数组,if / then,重新排序行?

时间:2017-05-18 16:11:30

标签: python arrays string

首先让我说我对Python一无所知,但我正在努力学习(主要是通过挣扎似乎)。我已经浏览了这个网站,试图拼凑代码来做我需要的东西,但是我一直遇到问题。首先,我需要将2列和512行字符串的文件转换为浮点数,然后将它们放入512x2数组中。我检查第一列(所有行)的负值。如果是负数,则添加512.然后我需要按数字顺序重新排序行并写入/保存新数组。

关于我的第一个问题,转换为浮点数并将浮点数放入数组中。我有这个代码,我是从别人那里得到的。问题:

with open("binfixtest.composite") as f: f_values = map(lambda l: l.strip().split(' '), f) print f_values newarray = [map(float, v) for v in f_values]

档案的原始格式:

-91. 0.444253325 -90. 0.883581936 -89. -0.0912338793

f_values的新格式: ['-91. 0.444253325'], ['-90. 0.883581936'], ['-89. -0.0912338793']

我收到错误:

Traceback (most recent call last): File "./binfix.py", line 10, in <module> newarray = [map(float, v) for v in f_values] ValueError: invalid literal for float(): -91. 0.444253325

我无法解决这个问题。如果我没有转换为浮点数,当我尝试将512.0添加到负数行时,它会向我显示错误TypeError: cannot concatenate 'str' and 'float' objects

任何帮助都绝对值得赞赏,因为我在这里完全无能为力。

2 个答案:

答案 0 :(得分:1)

第一部分:

@ njzk2是完全正确的。只需删除要从l.strip().split(' ')更改为l.strip().split()的文字空格将更正错误,您将看到f_values的以下输出:

  

[[ - - 91。','0.444253325'],[' - 90。','0.883581936'],[' - 89。',' - 0.0912338793']]

newarray的输出显示浮点值而不是字符串:

  

[[ - 91.0,0.444253325],[ - 90.0,0.883581936],[ - 89.0,-0.0912338793]]

第二部分:

对于问题的第二部分“如果是否定的,添加512 ”,一个简单的循环将是清晰和简单的,我非常相信清晰,可读的代码。

例如,以下内容简单明了:

for items in newarray: if items[0] < 0: items[0] += 512.00

当我们在循环后print newarray时,我们会看到以下内容:

  

[[421.0,0.444253325],[422.0,0.883581936],[423.0,-0.0912338793]]

答案 1 :(得分:1)

如果你不时要做这样的任务,我有一些建议。

让您的生活更轻松的事情是开始学习使用numpy数组而不是尝试使用自己的数组(由列表列表组成)。

对于此问题,您可以像这样使用numpy

>>> import numpy as np
>>> data = np.loadtxt('binfixtest.composite')
>>> data
array([[-91.    ,   0.44425332],
   [-90.        ,   0.88358194],
   [-89.        ,  -0.09123388]])

那就是它。完成。您的数据现在位于一个充满浮点数的numpy数组中。

这是有效的,因为默认情况下,numpy.loadtxt method将换行符读取为行分隔符,将空格(包括空格和制表符)作为列分隔符读取,将数字作为浮点数读取。如果您需要,还可以使用许多其他选项来自定义numpy读取文件的方式。

查看numpy数组

要访问第0行,请执行以下操作:

>>> data[0]
array([-91.        ,   0.44425332])

要访问地址0,0的值,请执行以下操作:

>>> data[0,0]
-91.0

要访问第0列,请执行此操作(第一个冒号表示&#34;所有行&#34;):

>>> data[:,0]
array([-91., -90., -89.])

要访问行/列范围,请执行以下操作:

>>> data[1:, :2]
array([[-90.        ,   0.88358194],
       [-89.        ,  -0.09123388]])

上述方法&#34;所有行从位置1开始,所有列直到并且不包括位置2和#34;。您还可以执行1:3之类的操作,从位置1开始,总共可以获得两行或一列(3-1 = 2)。

更改numpy数组

要更改单个值,请执行以下操作:

>>> data[0,0] = 1
>>> data[0,0]
1.0

请注意,我们在0,0处更改的值已存储为浮点数,即使您已分配给int。这是因为numpy数组具有ONE数据类型,并且您放入该数组中的任何内容都将尝试转换为该数据类型:

>>> data.dtype
dtype('float64')

如果要在数组中的特定地址处为值添加512,可以执行以下操作:

>>> data[0,0] = data[0,0] + 512
>>> data[0,0]
421.0

如果要在整个第一列中添加512,可以执行以下操作:

>>> data[:,0] = data[:,0] + 512
>>> data
array([[  4.21000000e+02,   4.44253325e-01],
       [  4.22000000e+02,   8.83581936e-01],
       [  4.23000000e+02,  -9.12338793e-02]])

numpy数组

的有用操作

如果你想对一个数组(或一个数组的一部分)进行比较,那就这样做(它将返回一个新的数组):

>>> data<0
array([[ True, False],
       [ True, False],
       [ True,  True]], dtype=bool)

只获取数组中小于零的值的一种方法是以下(还有其他方法):

>>> data*(data<0)
array([[-91.        ,   0.        ],
       [-90.        ,   0.        ],
       [-89.        ,  -0.09123388]])

这是有效的,因为在numpy中,True值的行为类似于1,False值的行为类似于0

最后,如果你想在整个第一列中添加512,只有当值是负数时,你可以将所有这些放在一起并执行此操作:

>>> data[:,0] = (data[:,0]+512)*(data[:,0]<0)
>>> data
array([[  4.21000000e+02,   4.44253325e-01],
       [  4.22000000e+02,   8.83581936e-01],
       [  4.23000000e+02,  -9.12338793e-02]])

将数组保存到新文件

如果您希望将阵列保存到新文件,可以使用numpy.savetxt method

>>> np.savetxt('output.txt', data, fmt = '%.8f', delimiter = '    ', newline = '\n')

fmt = '%.8f'参数指定应如何打印浮点值(在这种情况下,它将以8位小数打印)。有关详细信息,请参阅this part of the docs