首先我要说的是,我对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/