Frage

Im Moment habe ich dargestellten Werte als Listen Vector3. gibt es eine Möglichkeit, 2 davon wie vector3 Werte zu subtrahieren, wie

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

Soll ich Tupeln?

Wenn keiner von ihnen definiert diese Operanden auf diese Art, kann ich es definieren stattdessen?

Wenn nicht, sollte ich eine neue vector3 Klasse?

War es hilfreich?

Lösung

Ist dies etwas, das Sie häufig am Ende tut, und mit verschiedenen Operationen, sollten Sie vielleicht eine Klasse erstellen, um Fälle wie diese handhaben, oder besser eine Bibliothek verwenden wie Numpy .

Ansonsten sucht Listenkomprehensionen verwendet mit der zip eingebaute Funktion:

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

Andere Tipps

Hier ist eine alternative Comprehensions aufzulisten. Karte durchläuft die Liste (n) (letztere Argumente), so unerwuenscht tun, und übergibt ihre Elemente als Argumente für die Funktion (die erste arg). Es liefert die resultierende Liste.

map(operator.sub, a, b)

Dieser Code weil weniger Syntax (die für mich mehr Ästhetik ist), und anscheinend ist es 40% schneller für die Listen der Länge 5 (bobince Kommentar sehen). Dennoch wird entweder Lösung arbeiten.

Wenn Sie Ihre Listen a und b sind, können Sie tun:

map(int.__sub__, a, b)

Man sollte aber wahrscheinlich nicht. Niemand wird wissen, was es bedeutet.

Ich würde empfehlen NumPy als auch

Es ist nicht nur schneller für Vektor-Mathematik zu tun, aber es hat auch eine Tonne Komfortfunktionen.

Wenn Sie etwas wollen noch schneller für 1d Vektoren, versuchen VOP

Es ist ähnlich wie Matlab, aber frei und solche Sachen. Hier ist ein Beispiel dafür, was man tun würde

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

Boom.

Wenn Sie zwei Listen namens ‚a‘ und ‚b‘ können Sie tun: [m - n for m,n in zip(a,b)]

Eine etwas andere Vector-Klasse.

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)

Wenn Sie auf Ausführen mehr als einfache Einzeiler planen, wäre es besser, Ihre eigene Klasse zu implementieren und die entsprechenden Operatoren außer Kraft setzen, da sie auf Ihren Fall anwenden.

Genommen von Mathematik in 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)

Für die, die verwendeten PyCharm zu kodieren, sie belebt auch andere als gut.

 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]

Die Kombination von map und lambda Funktionen in Python ist eine gute Lösung für diese Art von Problem:

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

zip Funktion ist eine gute Wahl, wie gezeigt, durch @UncleZeiv

Versuchen Sie folgendes:

list(array([1,2,3])-1)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top