首先让我说我对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
任何帮助都绝对值得赞赏,因为我在这里完全无能为力。
答案 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。