سؤال

والآن لقد vector3 القيم ممثلة القوائم. هل هناك طريقة لطرح 2 من هذه القيم مثل vector3، مثل

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

هل يجب استخدام الصفوف؟

وإذا كان أي منهم يعرف هذه المعاملات على هذه الأنواع، يمكنني تحديد ذلك بدلا من ذلك؟

إذا لم يكن كذلك، يجب أن إنشاء فئة جديدة vector3؟

هل كانت مفيدة؟

المحلول

وإذا كان هذا هو شيء ينتهي به في كثير من الأحيان، ومع عمليات مختلفة، ربما يجب عليك إنشاء فئة للتعامل مع مثل هذه الحالات، أو الأفضل استخدام بعض المكتبات مثل <وأ href = "http://numpy.scipy.org / "يختلط =" noreferrer "> نمباي .

وإلا، والبحث عن القوائم المضمنة واستخدامها مع في الرمز البريدي وظيفة مدمج:

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

نصائح أخرى

وهنا بديل لالقوائم المضمنة. بالتكرار خريطة من خلال قائمة (ق) (الحجج الأخيرة)، وبذلك simulataneously، ويمر عناصرها كوسائط إلى وظيفة (وسيطة الأول). تقوم بإرجاع القائمة الناتجة.

map(operator.sub, a, b)

وهذا الرمز لديه أقل جملة (والذي هو أكثر جمالية بالنسبة لي)، وعلى ما يبدو أنها أسرع 40٪ للقوائم طول 5 (انظر التعليق bobince ل). ومع ذلك، فإن أي حل العمل.

إذا القوائم الخاصة بك هي أ و ب، يمكنك القيام به:

map(int.__sub__, a, b)

ولكن ربما كنت لا ينبغي. لا أحد يعرف ما يعنيه.

وكنت قد يوصي نمباي فضلا

وليس فقط لأنها أسرع للقيام ناقلات الرياضيات، ولكن كما أن لديها من نصف طن من وظائف الراحة.

إذا كنت تريد شيئا حتى أسرع لناقلات 1D، حاول VOP

وانها مماثلة لماتلاب، ولكن حرة والاشياء. وهنا مثال على ما كنت تفعل

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

والازدهار.

إذا كان لديك قائمتين يسمى "أ" و "ب"، يمكنك القيام به: [m - n for m,n in zip(a,b)]

وهناك فئة ناقلات مختلفة قليلا.

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)

إذا كنت تخطط لتنفيذ أكثر من بسيطة المتشددين واحد، سيكون من الأفضل لتنفيذ الفئة الخاصة بك وتجاوز مشغلي المناسبة من حيث انطباقها على قضيتك.

الرياضيات في بيثون :

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 في بيثون هو حل جيد لهذا النوع من المشاكل:

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

وظيفة zip هو خيار جيد آخر، كما يتضح منUncleZeiv

وجرب هذا:

list(array([1,2,3])-1)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top