Какой модуль Python подходит для работы с данными в списке?

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

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

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


person Léo Léopold Hertz 준영    schedule 29.01.2009    source источник


Ответы (4)


Если вам нужно много манипуляций с массивами, тогда 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])
person Community    schedule 30.01.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

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

person John Fouhy    schedule 30.01.2009

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

person Rory    schedule 30.01.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]
person Luiz Damim    schedule 30.01.2009
comment
В Python 3.0 функция уменьшения находится в модуле functools. - person sykora; 30.01.2009