2013-08-02 48 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] 

希望这有助于:)