【问题标题】:Using iterator to sum arrays in python在python中使用迭代器对数组求和
【发布时间】:2013-08-04 00:15:43
【问题描述】:

我在 python 中使用 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 是一个以数组表示的向量,下面的点表示该值。如您所见,每个 x1、y1 等都有多个点。现在我想将这些点相加,使其成为使用迭代器的向量的总和。如何使用迭代器对所有行求和?

像这样:

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

但这只是 2 个数组,如果有数百个,那么您需要一个迭代器而不是手动设置数组吗?

【问题讨论】:

  • 预期输出是什么?
  • 粘贴的代码中有些东西被截断了。
  • 让我们说 a = [x1,y1,z1] 和 b = [x2,y2,z2] 总和是 a+b 但我想使用迭代器,这样我就可以处理所有行。
  • 为什么要使用迭代器?这听起来像是围绕np.sumndarraysum 方法构建的工作。显式迭代往往会破坏 numpy 的优势。
  • 我不想像 x1+y1+z1 那样对列中的点求和我试图总结所有 x1 点和所有 y1 点......等等

标签: python arrays csv numpy


【解决方案1】:

为什么不导入跳过第一行?

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

然后

np.sum(data,axis=0)

【讨论】:

  • @Andy 这个答案会给你一个更高的性能,因为它避免了for 循环......
【解决方案2】:

正如其他人评论的那样,可能有一些方法可以使用内置函数来执行此操作,但以下执行方式与您描述的一样:

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

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

首先,我们初始化一个空白的sum 向量,等于数据矩阵的宽度。然后,我们遍历实际的数据向量并将它们添加到 sum。

【讨论】:

  • 你能解释一下这行:vector = np.asarray(map(float, vector)) 的作用真的很快吗?
  • 抱歉,应该是vector = map(float, vector)!无论如何,因为它是作为文本读入的,所以我们需要将vector 中的每个元素从字符串转换为浮点数(例如,从 '0.5' 到 0.5)。 map(float, vector)float(x) 应用于vector 中的每个x
【解决方案3】:

如果您想在 python 中执行此操作,其中一种方法可以是迭代列表 假设输入,即数组列表是 inp,输出数组存储在 total

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

希望这会有所帮助:)

【讨论】:

    猜你喜欢
    • 2014-08-31
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 2017-09-12
    • 2016-01-31
    • 2014-07-11
    • 2014-05-07
    相关资源
    最近更新 更多