【问题标题】:Which Python module is suitable for data manipulation in a list?哪个 Python 模块适合列表中的数据操作?
【发布时间】:2010-10-04 09:04:18
【问题描述】:

我有一系列 x、y 和 z 坐标,我需要对其进行操作。它们位于三个元组的一个列表中,例如 {(x1, y1, z1), (x2, y2, z2), ...}。

我需要加法、乘法和对数来处理我的数据。

我想学习一个模块,它和 awk 语言一样强大。

【问题讨论】:

    标签: python module


    【解决方案1】:

    我不确定你到底在追求什么。你可以用列表推导做很多事情。例如,如果你想翻一个列表:

    coords = [(x1, y1, z1), (x2, y2, z2), (x3, y3, z3)]  # etc
    

    变成一个元组(x1+x2+x3, y1+y2+y3, z1+z2+z3),那么你可以这样做:

    sums = (sum(a[0] for a in coords), sum(a[1] for a in coords), sum(a[2] for a in coords))
    

    事实上,一个有经验的 Python 程序员可能会这样写:

    sums = map(sum, zip(*coords))
    

    虽然这对初学者来说有点像魔术。

    如果你想跨坐标相乘,那么这个想法是相似的。唯一的问题是 python 没有等效于sum 的内置乘法。我们可以自己构建:

    import operator
    def prod(lst):
        return reduce(operator.mul, lst)
    

    然后你可以将你的元组按坐标相乘:

    prods = map(prod, zip(*coords))
    

    如果您想用乘法(内积?)做一些更复杂的事情,这将需要更多的工作(虽然不会很困难)。

    我不确定你想取什么对数。但是你可以在数学模块中找到日志函数:

    from math import log
    

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      如果你需要大量的数组操作,那么 numpy 是 python 中的最佳选择

      >>> import numpy
      >>> data = numpy.array([(2, 4, 8), (3, 6, 5), (7, 5, 2)])
      >>> data
      array([[2, 4, 8],
             [3, 6, 5],
             [7, 5, 2]])
      
      >>> data.sum()  # product of all elements
      42
      >>> data.sum(axis=1)   # sum of elements in rows
      array([14, 14, 14])
      >>> data.sum(axis=0)   # sum of elements in columns
      array([12, 15, 15])
      >>> numpy.product(data, axis=1)   # product of elements in rows
      array([64, 90, 70])
      >>> numpy.product(data, axis=0)   # product of elements in columns
      array([ 42, 120,  80])
      >>> numpy.product(data)      # product of all elements
      403200
      

      或对数组进行元素操作

      >>> x,y,z = map(numpy.array,[(2, 4, 8), (3, 6, 5), (7, 5, 2)])
      >>> x
      array([2, 4, 8])
      >>> y
      array([3, 6, 5])
      >>> z
      array([7, 5, 2])
      
      >>> x*y
      array([ 6, 24, 40])
      >>> x*y*z
      array([ 42, 120,  80])
      >>> x+y+z
      array([12, 15, 15])
      

      元素明智的数学运算,例如

      >>> numpy.log(data)
      array([[ 0.69314718,  1.38629436,  2.07944154],
             [ 1.09861229,  1.79175947,  1.60943791],
             [ 1.94591015,  1.60943791,  0.69314718]])
      >>> numpy.exp(x)
      array([    7.3890561 ,    54.59815003,  2980.95798704])
      

      【讨论】:

        【解决方案3】:

        您不需要单独的库或模块来执行此操作。 Python 具有内置于语言中的列表推导,可让您操作列表并执行计算。如果您想要进行大量科学计算,或者想要进行大量繁重的数字运算,您可以使用 numpy 模块来做同样的事情。

        【讨论】:

          【解决方案4】:

          在 Python 3 中,reduce 函数消失了。你可以这样做:

          def prod(lst):
              return [x*y*z for x, y, z in list(zip(*lst))]
          
          coords = [(2, 4, 8), (3, 6, 5), (7, 5, 2)]
          print(prod(coords))
          >>> [42, 120, 80]
          

          【讨论】:

          • 在python 3.0中,reduce函数在functools模块中。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-12-04
          • 2011-12-10
          • 1970-01-01
          • 2011-03-27
          • 2015-02-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多