Python:将字符串转换为 float ,将 float 读入二维数组,if/then,行重新排序?

标签 python arrays string

首先我要说的是,我对Python一无所知,但我正在努力学习(看起来主要是通过努力学习)。我浏览过这个网站并尝试拼凑代码来完成我需要的事情,但我不断遇到问题。首先,我需要将 2 列和 512 行字符串的文件转换为 float ,然后将它们放入 512x2 数组中。我检查第一列(所有行)是否有负值。如果为负,则添加 512。然后我需要按数字顺序重新排序行并写入/保存新数组。

关于我的第一个问题,转换为 float 并将 float 放入数组中。我有这个代码,是我根据别人的问题编写的:

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

我似乎无法修复。如果我不转换为 float ,当我尝试将 512.0 添加到负行时,它会给出错误 TypeError: cannot concatenate 'str' and 'float' objects

非常感谢任何帮助,因为我在这里完全一无所知。

最佳答案

如果您预计必须时不时地执行此类任务,我有一些建议。

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

对于这个问题,你可以像这样使用numpy:

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

就是这样。完毕。您的数据现在位于充满 float 的 numpy 数组中。

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

查看您的 numpy 数组

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

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

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

>>> data[0,0]
-91.0

要访问第零列,请执行以下操作(第一个冒号表示“所有行”):

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

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

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

上面的意思是“所有行从位置 1 开始,所有列直到位置 2(不包括位置 2)”。您还可以执行类似 1:3 的操作,这将从位置 1 开始总共两行或两列 (3-1=2)。

更改您的 numpy 数组

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

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

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

>>> 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了解更多信息。

关于Python:将字符串转换为 float ,将 float 读入二维数组,if/then,行重新排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44052893/

相关文章:

python - 使用 Python C API 命名参数?

java - 无法在 weblogic、JMS、java 中设置 JMS_IBM_MQMD_MsgId 的属性值

python - 删除 numpy 数组中的孤立单元格

c++ - 在 struct C++ 中使用 char* 或 char []

c++ - 从字符串中删除重复的字符

Java 字符串输入错误

python - 将时间线卡推送到给定的用户 ID

python - ElasticSearch-过滤嵌套对象而不影响 “parent”对象

c - c中的静态矩阵乘法到动态矩阵

python - 如何用可调用类装饰类方法?