Вычитание 2 списков в Python
Прямо сейчас у меня есть значения vector3, представленные в виде списков. есть способ вычесть 2 из таких значений vector3, например
[2,2,2] - [1,1,1] = [1,1,1]
Должен ли я использовать кортежи?
Если ни один из них не определяет эти операнды для этих типов, могу ли я определить его вместо?
Если нет, должен ли я создать новый класс vector3?
Ответы
Ответ 1
Если это то, что вы часто делаете, и с разными операциями, вы, вероятно, должны создать класс для обработки таких случаев или лучше использовать некоторую библиотеку, например Numpy.
В противном случае найдите список понятий, используемый с zip встроенная функция:
[a_i - b_i for a_i, b_i in zip(a, b)]
Ответ 2
Здесь альтернатива спискам. Карта выполняет итерацию по списку (последним аргументам), делая это симулятивно и передает свои элементы в качестве аргументов функции (первый аргумент). Он возвращает результирующий список.
map(operator.sub, a, b)
Этот код, потому что имеет меньше синтаксиса (что для меня более эстетично) и, по-видимому, на 40% быстрее для списков длины 5 (см. комментарий bobince). Тем не менее, любое решение будет работать.
Ответ 3
Я бы рекомендовал NumPy, а также
Он не только ускоряет выполнение векторной математики, но также имеет тонну удобных функций.
Если вы хотите что-то еще быстрее для 1d векторов, попробуйте vop
Это похоже на MatLab, но бесплатное и прочее. Вот пример того, что вы будете делать
from numpy import matrix
a = matrix((2,2,2))
b = matrix((1,1,1))
ret = a - b
print ret
>> [[1 1 1]]
Boom.
Ответ 4
Если ваши списки - a и b, вы можете сделать:
map(int.__sub__, a, b)
Но вы, вероятно, не должны. Никто не узнает, что это значит.
Ответ 5
Посмотрите NumPy пакет для python.
Ответ 6
Если у вас есть два списка с именем "a" и "b", вы можете сделать: [m - n for m,n in zip(a,b)]
Ответ 7
Немного другой класс Vector.
class Vector( object ):
def __init__(self, *data):
self.data = data
def __repr__(self):
return repr(self.data)
def __add__(self, other):
return tuple( (a+b for a,b in zip(self.data, other.data) ) )
def __sub__(self, other):
return tuple( (a-b for a,b in zip(self.data, other.data) ) )
Vector(1, 2, 3) - Vector(1, 1, 1)
Ответ 8
Если вы планируете выполнять больше простых прошивок, было бы лучше реализовать свой собственный класс и переопределить соответствующие операторы, как они применяются к вашему делу.
Взято из Математика в Python:
class Vector:
def __init__(self, data):
self.data = data
def __repr__(self):
return repr(self.data)
def __add__(self, other):
data = []
for j in range(len(self.data)):
data.append(self.data[j] + other.data[j])
return Vector(data)
x = Vector([1, 2, 3])
print x + x
Ответ 9
Если вы хотите получить результат в списке:
list(numpy.array(list1)-numpy.array(list2))
если не удалить список.
Ответ 10
import numpy as np
a = [2,2,2]
b = [1,1,1]
np.subtract(a,b)
Ответ 11
Попробуйте следующее:
list(array([1,2,3])-1)