Какой модуль Python подходит для обработки данных в списке? - PullRequest
3 голосов
/ 30 января 2009

У меня есть последовательность x, y и z -координат, которыми я должен манипулировать. Они находятся в одном списке из трех кортежей, например {(x1, y1, z1), (x2, y2, z2), ...}.

Мне нужны сложение, умножение и логарифм для манипулирования моими данными.

Я бы хотел изучить модуль, такой же мощный, как и Awk -языок.

Ответы [ 4 ]

8 голосов
/ 30 января 2009

Я не уверен, что именно вы ищете. Вы можете многое сделать с пониманием списка. Например, если вы хотите превратить список:

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

Надеюсь, это поможет.

7 голосов
/ 30 января 2009

Если вам нужно много манипуляций с массивами, тогда 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])
2 голосов
/ 30 января 2009

Вам не нужна отдельная библиотека или модуль для этого. Python имеет встроенные в язык списки, которые позволяют вам манипулировать списками и выполнять вычисления. Вы можете использовать модуль numpy, чтобы сделать то же самое, если вы хотите выполнить много научных вычислений, или если вы хотите сделать много сложных вычислений.

1 голос
/ 30 января 2009

В 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...