Модификация массива 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) заставил это никогда не быть прочитанным в.

Другие вопросы по тегам