Модификация массива Numpy на месте
У меня есть файл, который выглядит так:
row column layer value1 value2
8 454 1 0.000e+0 1.002e+4
8 455 1 0.000e+0 1.001e+4
8 456 1 0.000e+0 1.016e+4
8 457 1 0.000e+0 1.016e+4
.
.
.
Я хочу сделать некоторые вычисления в последнем столбце (например, умножить на 10) и сохранить его (на месте или в виде нового файла) без изменения формата. Я знаю, как загрузить его, но я не знаю, как продолжить. Я делаю следующее, чтобы загрузить данные:
import numpy as np
ic = np.genfromtxt("file.dat",skip_header=1, usecols=(0,1,2,4),
dtype=None, names = ['row', 'column', 'layer', 'value2'])
файл насчитывает 150M, так что быстрое выполнение будет полезно.
1 ответ
Решение
В вашем примере столбцы проиндексированы только от 0 до 4, поэтому usecols=(0,1,2,5)
выдает ошибку с файлом в вашем примере. Если предположить, usecols=(0,1,2,4)
:
Вы можете изменить массив на месте с помощью
for i in range(0,len(ic)):
ic[i]['value2'] *= 10
и сохранить его в текст с разделителями табуляции с помощью
np.savetxt("mul.dat", ic, fmt="%d %d %e %e", delimiter="\t", header=" ".join(ic.dtype.names))
производства
# row column layer value2
8 454 1.000000e+00 1.002000e+05
8 455 1.000000e+00 1.001000e+05
8 456 1.000000e+00 1.016000e+05
8 457 1.000000e+00 1.016000e+05
Но вы не сможете выписать value1
колонка, если ваш usecols(0,1,2,4)
заставил это никогда не быть прочитанным в.