2013-08-02 46 views
2

陣列我在蟒使用numpy的讀取csv文件:使用迭代來總結在python

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是一個在數組中表示的向量,下面的點表示該值。正如你所看到的,每個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]並且總和爲a + 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)'應用於'vector'中的每個'x'。 –

5

爲什麼不導入跳過第一行?

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

然後

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

謝謝你正確的答案! – Andy

+2

@所以這個答案會給你一個更高的性能,因爲它避免了'for'循環... –

0

如果你想這樣做,在python的方法之一可以是迭代名單 假設陣列的輸入即列表INP和輸出數組存儲在總

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

希望這有助於:)