如何从文件中的每个其他值中减去每个第一列值?

问题描述 投票:2回答:2

我有一个文件,其中包含如下内容

14.678  14.652  14.636  14.623  14.615  14.608  14.603  14.599  14.596
17.448  17.427  17.413  17.402  17.395  17.390  17.386  17.384  17.382
18.271  18.252  18.240  18.231  18.223  18.217  18.212  18.211  18.209
20.239  20.216  20.198  20.188  20.168  20.164  20.165  20.147  20.125
20.500  20.480  20.458  20.438  20.421  20.400  20.382  20.368  20.355
17.195  17.173  17.159  17.150  17.143  17.138  17.134  17.132  17.130
18.652  18.628  18.611  18.600  18.590  18.583  18.580  18.571  18.565
18.721  18.697  18.684  18.673  18.665  18.656  18.648  18.645  18.644
19.501  19.452  19.396  19.314  19.166  18.936  18.629  18.325  18.089
18.470  18.449  18.434  18.421  18.413  18.406  18.401  18.399  18.397
18.288  18.266  18.254  18.245  18.237  18.232  18.229  18.228  18.227
18.691  18.669  18.653  18.641  18.631  18.622  18.614  18.612  18.606
17.407  17.387  17.375  17.366  17.360  17.355  17.352  17.349  17.348
16.691  16.672  16.659  16.649  16.643  16.639  16.635  16.632  16.631
19.293  19.271  19.253  19.244  19.233  19.226  19.218  19.209  19.201
18.530  18.509  18.493  18.482  18.474  18.469  18.463  18.457  18.452
18.769  18.742  18.725  18.712  18.701  18.695  18.688  18.682  18.681
18.356  18.335  18.320  18.310  18.300  18.294  18.288  18.283  18.281
18.332  18.313  18.298  18.286  18.280  18.276  18.271  18.267  18.265
14.998  14.977  14.963  14.953  14.945  14.940  14.936  14.933  14.930

我想从每个其他值中删除每个第一列值。操作应该是这样的

14.678 - 17.448
14.678 - 18.271
14.678 - 18.271
and so on...

同样

17.448 - 14.678
17.448 - 18.271
17.448 - 20.239
and so on...

到目前为止,我能做的是

with open("geodata.txt", "r") as fo:
    for i in fo:
        for j in fo:
            print(float(i.split(" ")[0]) - float(j.split(" ")[0]))

但它只进行一次操作然后停止。

-2.7699999999999996
-3.593
-5.561
-5.821999999999999
-2.5169999999999995
-3.974
-4.042999999999999
-4.823
-3.791999999999998
-3.6099999999999994
-4.012999999999998
-2.728999999999999
-2.012999999999998
-4.614999999999998
-3.8520000000000003
-4.0909999999999975
-3.678000000000001
-3.654
-0.3199999999999985

我尝试添加一个while循环来执行此操作20次(有20行)但计算需要永远。我怎样才能实现这一点?

python arrays python-3.x file
2个回答
0
投票

使用Python的内置CSV库,可以按如下方式完成:

import csv

with open('geodata.txt', 'r', newline='') as f_input, open('output.csv', 'w', newline='') as f_output:
    csv_input = csv.reader(f_input, delimiter=' ', skipinitialspace=True)
    csv_output = csv.writer(f_output, delimiter=' ')
    first_row = list(map(float, next(csv_input)))

    for row in csv_input:
        new_row = [first_value - float(value) for first_value, value in zip(first_row, row)]
        csv_output.writerow(new_row)

给你一个output.csv文件开始:

-2.7699999999999996 -2.7750000000000004 -2.777000000000001 -2.7790000000000017 -2.7799999999999994 -2.782 -2.7829999999999995 -2.785 -2.7860000000000014
-3.593 -3.5999999999999996 -3.603999999999999 -3.6080000000000023 -3.6079999999999988 -3.608999999999998 -3.609 -3.6119999999999983 -3.6129999999999995
-5.561 -5.564000000000002 -5.562000000000001 -5.5649999999999995 -5.552999999999999 -5.556000000000001 -5.561999999999999 -5.547999999999998 -5.529

1
投票

您可以使用numpy作为就地矢量化解决方案。

import numpy as np

arr = np.genfromtxt('file.csv')

x[:, 1:] *= -1
x[:, 1:] += x[:, 0][:, None]

[:, None]部分是确保尺寸匹配所必需的。

要保存回csv文件:

np.savetxt('file2.csv', arr, delimiter=' ')

我假设您能够将数字数据读入numpy数组。

import numpy as np

x = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9],
              [10, 11, 12]])

x[:, 1:] *= -1
x[:, 1:] += x[:, 0][:, None]

print(x)

# [[ 1 -1 -2]
#  [ 4 -1 -2]
#  [ 7 -1 -2]
#  [10 -1 -2]]
© www.soinside.com 2019 - 2024. All rights reserved.