3

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

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

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

4

4 回答 4

8

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

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

进入一个 tuple (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))

如果你想用乘法(内积?)做一些更复杂的事情,那将需要更多的工作(尽管它不会很困难)。

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

from math import log

希望这可以帮助。

于 2009-01-30T00:10:42.370 回答
7

如果你需要很多数组操作,那么 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])
于 2009-01-30T11:28:15.513 回答
2

您不需要单独的库或模块来执行此操作。Python 在语言中内置了列表推导,它允许您操作列表并执行计算。如果你想做很多科学计算,或者如果你想做很多繁重的数字运算,你可以使用 numpy 模块来做同样的事情。

于 2009-01-30T11:42:37.997 回答
1

在 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]
于 2009-01-30T00:38:38.740 回答