À l'heure actuelle, j'ai des valeurs vector3 représentées sous forme de listes. existe-t-il un moyen de soustraire 2 de ces valeurs telles que vector3, comme
[2,2,2] - [1,1,1] = [1,1,1]
Devrais-je utiliser des n-uplets?
Si aucun d’eux ne définit ces opérandes sur ces types, puis-je le définir à la place?
Si non, devrais-je créer une nouvelle classe vector3?
Si c'est quelque chose que vous finissez souvent par faire et avec différentes opérations, vous devriez probablement créer une classe pour traiter de tels cas, ou mieux utiliser une bibliothèque comme Numpy .
Sinon, recherchez list comprehensions utilisé avec la fonction Zip builtin:
[a_i - b_i for a_i, b_i in Zip(a, b)]
Voici une alternative à la liste des compréhensions. Map parcourt la ou les listes (ces derniers arguments) simultanément et transmet leurs éléments en tant qu'arguments à la fonction (le premier argument). Il retourne la liste résultante.
map(operator.sub, a, b)
Ce code a moins de syntaxe (ce qui est plus esthétique pour moi) et apparemment, il est 40% plus rapide pour les listes de longueur 5 (voir le commentaire de bobince). Reste que l'une ou l'autre solution fonctionnera.
Si vos listes sont a et b, vous pouvez faire:
map(int.__sub__, a, b)
Mais vous ne devriez probablement pas. Personne ne saura ce que cela signifie.
Je devrais recommander NumPy aussi
Non seulement il est plus rapide pour les mathématiques vectorielles, mais il a aussi une tonne de fonctions pratiques.
Si vous voulez quelque chose d'encore plus rapide pour les vecteurs 1d, essayez vop
C'est similaire à MatLab, mais gratuit et tout. Voici un exemple de ce que vous feriez
from numpy import matrix
a = matrix((2,2,2))
b = matrix((1,1,1))
ret = a - b
print ret
>> [[1 1 1]]
Boom.
Si vous avez deux listes appelées 'a' et 'b', vous pouvez faire: [m - n for m,n in Zip(a,b)]
Une classe de vecteur légèrement différente.
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)
Si vous envisagez de réaliser plus que de simples ligneurs, il serait préférable d'implémenter votre propre classe et de remplacer les opérateurs appropriés en fonction de votre cas.
Tiré de Mathématiques en 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)
Pour celui qui codait auparavant sur Pycharm, cela ravive également les autres.
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]
La combinaison des fonctions map
et lambda
en Python est une bonne solution à ce type de problème:
a = [2,2,2]
b = [1,1,1]
map(lambda x,y: x-y, a,b)
La fonction Zip
est un autre bon choix, comme l'a démontré @UncleZeiv.