2013-08-02 7 views
2

Я использую Numpy в питона читать CSV файл:Использование итератора для суммирования массивов в питона

import numpy as np 
import csv 
from StringIO import StringIO 
with open ('1250_12.csv','rb') as csvfile: 
    data = np.genfromtxt(csvfile, dtype = None, delimiter = ',') 
np.set_printoptions(threshold='nan' 

, которая печатает следующее:

[['x1' 'y1' 'z1' 'x2' 'y2' 'z2' 'cost'] 
['5720.44' '3070.94' '2642.19' '5797.82' '3061.01' '2576.29' '102.12'] 
['5720.44' '3070.94' '2642.19' '5809.75' '3023.6' '2597.81' '110.4'] 
['5861.54' '3029.08' '2742.36' '5981.23' '3021.52' '2720.47' '121.92'] 
['5861.54' '3029.08' '2742.36' '5955.36' '3012.95' '2686.28' '110.49'] 

поэтому первый столбец принадлежит «x1 ', второй столбец принадлежит «x2» ... и т. д. Предположим, что x1, y1, z1 - вектор, представленный в массиве, а точки под ним представляют значение. Как вы можете видеть, существуют точки mulitple для каждого x1, y1 ... и т. Д. Теперь я хочу добавить точки так, чтобы они стали суммой векторов, использующих итератор. Как использовать итератор для суммирования всех строк?

так:

import numpy 
a=numpy.array([0,1,2]) 
b=numpy.array([3,4,5]) 
a+b 
array([3, 5, 7]) 

, но это только 2 массивы, что, если есть сотни, то вы должны итератор вместо того, чтобы устанавливать массивы вручную правильно?

+0

Что ожидаемый результат? –

+0

Что-то обрезалось в вашем вставленном коде. – user2357112

+0

позволяет сказать a = [x1, y1, z1] и b = [x2, y2, z2], а сумма равна + b, но я хочу использовать итератор, чтобы я мог обрабатывать все строки. – Andy

ответ

1

Как и другие отметили, Есть, вероятно, способы сделать это с помощью встроенных функций, но следующие выполняет, как вы описали:

sum = np.zeros(len(data[0])) 

for vector in data[1:]: 
    vector = map(float, vector) 
    sum = np.add(vector, sum) 

Во-первых, мы инициализируем пустой sum вектор, равный ширину матрицы данных. Затем мы перебираем фактические векторы данных и добавляем их к сумме.

+0

оба правильные – Andy

+0

вы можете объяснить, что это за линия: vector = np.asarray (map (float, vector)) действительно быстро? – Andy

+0

Извините, это должно быть просто 'vector = map (float, vector)'! Во всяком случае, поскольку он читается как текст, нам нужно преобразовать каждый элемент в 'vector' из строки в float (например, от« 0,5 »до 0,5). 'map (float, vector)' применяет 'float (x)' к каждому 'x' в' vector'. –

5

Почему бы не импортировать пропущенную первую строку?

data = np.genfromtxt('1250_12.csv', delimiter = ',', skip_header=1) 

затем

np.sum(data,axis=0) 
+0

спасибо правильный ответ! – Andy

+2

@ Andy этот ответ даст вам гораздо более высокую производительность, поскольку он избегает цикла 'for' ... –

0

Если вы хотите сделать это в Python один из способов может быть перебирать список Давайте предположим, что входной т.е. список массива вх и выходной массив хранится в общей сложности

total = inp[1] 
for eachRow in inp[2:]: 
    for index, val in enumerate(eachRow): 
     total[index] += eachRow[index] 

Надеется, что это помогает :)

Смежные вопросы