我的文本文件中有一个数字列,如下所示:
import numpy as np
inpdata=np.load("test.npy",allow_pickle=True).item()
data1=inpdata['data']
for colms in data1:
np.ma.masked
(第一列数字不是行号。)
我想通过将每一列乘以 10 1 -0.93
11 1 -0.93
12 1 -0.93
13 1 -0.93
...
、0.1
、0.2
等来替换最后一列数字,结果是
0.3
我知道我可以使用 10 1 -0.093
11 1 -0.186
12 1 -0.279
13 1 -0.372
...
寄存器进行数学运算(这是正确的术语吗?),但我似乎无法弄清楚如何自动执行此操作。请指教。
答案 0 :(得分:5)
假设 0.1
/0.2
/... 对应于“行号 / 10”,您可以使用
%s/\v(\S+)$/\=str2float(submatch(1)) * line('.') * 0.1
它捕获最后一列并使用a
返回“value * line_number * 0.1”的结果
sub-replace-expression(有关详细信息,请参阅 :help sub-replace-expression
)。
如果值不是从第 1 行开始,您可以使用视觉选择(设置 line("'<")
)并使用 line('.') - line("'<") + 1
来了解您在块中的位置。然后添加初始乘数(此处为 0.1
):
'<,'>s/\v(\S+)$/\=str2float(submatch(1)) * (line('.') - line("'<") + 1) * 0.1
答案 1 :(得分:0)
使用 awk
(阅读和使用)会容易得多,如果您可以制作立即删除的数据文件的副本(即,如果您的数据文件很大,则不要使用)。
试试:
: ! awk '{ $NF=$NF*(0.1 * NR); print}' data_file > tmp && mv tmp data_file
在终端中使用 !
在 Vim 之外运行命令。然后,对于 data_file
中的每一行,awk
将最后一列 $NF
替换为自身乘以 (0.1 * NR)
,其中 NR
是行号。你可以用任何你想要的数学逻辑来改变它。然后它会打印您的修改的整行。
现在,您只需将此输出存储在临时文件 tmp
中,然后用修改后的数据覆盖您的 data_file
,因此 mv
命令。
Vim 会要求您重新加载文件,您应该在新修改的数据中加载该文件。