Вопрос

Сейчас у меня есть значения вектора3, представленные в виде списков.есть ли способ вычесть 2 из этих значений, например, вектора3, например

[2,2,2] - [1,1,1] = [1,1,1]

Должен ли я использовать кортежи?

Если ни один из них не определяет эти операнды для этих типов, могу ли я определить его вместо этого?

Если нет, следует ли мне создать новый класс вектора3?

Это было полезно?

Решение

Если это то, что вы делаете часто и с разными операциями, вам, вероятно, следует создать класс для обработки подобных случаев или лучше использовать какую-нибудь библиотеку, например Нампи.

В противном случае ищите список понятий используется с молния встроенная функция:

[a_i - b_i for a_i, b_i in zip(a, b)]

Другие советы

Вот альтернатива перечислению понятий.Map выполняет итерацию по спискам (последние аргументы), делая это одновременно, и передает их элементы в качестве аргументов функции (первый аргумент).Он возвращает результирующий список.

map(operator.sub, a, b)

В этом коде меньше синтаксиса (что для меня более эстетично), и, очевидно, он на 40% быстрее для списков длиной 5 (см. комментарий bobince).Тем не менее, любое решение будет работать.

Если ваши списки a и b, вы можете сделать:

map(int.__sub__, a, b)

Но вам, вероятно, не следует.Никто не узнает, что это значит.

Я должен был бы порекомендовать NumPy также

Он не только быстрее справляется с векторными математическими вычислениями, но также имеет массу удобных функций.

Если вам нужно что-то еще быстрее для 1d векторов, попробуйте воп

Это похоже на MatLab, но бесплатно и все такое.Вот пример того, что вы бы сделали

from numpy import matrix
a = matrix((2,2,2))
b = matrix((1,1,1))
ret = a - b
print ret
>> [[1 1 1]]

Бум.

Если у вас есть два списка, называемые «a» и «b», вы можете сделать: [m - n for m,n in zip(a,b)]

Немного другой класс 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)

Если вы планируете выполнять больше, чем простые однострочники, было бы лучше реализовать свой собственный класс и переопределить соответствующие операторы, применимые к вашему случаю.

Взято из Математика в 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
import numpy as np
a = [2,2,2]
b = [1,1,1]
np.subtract(a,b)

Для того, кто раньше писал код на Pycharm, это также оживляет и других.

 import operator
 Arr1=[1,2,3,45]
 Arr2=[3,4,56,78]
 print(list(map(operator.sub,Arr1,Arr2)))
arr1=[1,2,3]
arr2=[2,1,3]
ls=[arr2-arr1 for arr1,arr2 in zip(arr1,arr2)]
print(ls)
>>[1,-1,0]

Сочетание map и lambda Функции в Python — хорошее решение такого рода проблем:

a = [2,2,2]
b = [1,1,1]
map(lambda x,y: x-y, a,b)

zip function — еще один хороший выбор, как продемонстрировал @UncleZeiv

Попробуй это:

list(array([1,2,3])-1)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top