Я хочу читать файлы со следующей структурой:
1 3 7 34
1 4 3 6
1 8 2 10
2 9 35 11
2 10 12 24
...
количество столбцов меняется из одного файла в другой, и я хочу суммировать все значения столбцов для 1, 2 и т. Д.
Итак, результаты должны быть чем-то вроде
1 15 12 50
2 19 37 45
...
Я начал кодировать что-то вроде:
import numpy as np
import sysinFile = sys.argv[1]A = np.genfromtxt(inFile, delimiter=None)a = np.size(A,1) #get the number of columnsi = np.nonzero(np.diff(A[:, 0]))[0] + 1
i = np.insert(i, 0, 0)c1 = A[i, 0]
for l in range(3,a+1):
c = np.add.reduceat(A[:, l], i)
result = np.c_[c1, c]
Как это сделать с помощью numpy?
Метод Loopy
numpy
Это не самый красивый способ, и, скорее всего, это векторный подход, который намного более изящный и эффективный, но вы можете сделать следующее со списком. См. Нижнюю часть для эталона.
Для двухмерного массива
x
:Возвраты:
pandas
Для этого типа табличных данных вы можете рассмотреть
pandas
, Например:Вы также можете легко вернуть его в массив
numpy
:Benchmarks
К моему удивлению, оба метода сопоставимы по скорости, мой метод loopy
numpy
узко избиваетpandas
метод: в большом массиве формы(100000, 100)
метод loopynumpy
занял в среднем около 0,1 секунды, а методpandas
занял в среднем 0,13 секундыВот полностью векторизованный метод, предполагая, что идентификаторы сортируются. Идея:
x.shape = (1000000, 10)
,tally(x)
занял в среднем 0,23 секунды, аnp_method(x)
в среднем 0,07 секунды.numpy
версия:'1.13.3'
1000
идентификаторы в своем тесте. Если я использую10
, как в вашем тесте, ваш метод выполняется быстрее.