web-dev-qa-db-ja.com

Pythonの2つのリストを引く

現在、リストとして表されるvector3値があります。 vector3値のようにこれらの2つを減算する方法があります。

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

タプルを使用する必要がありますか?

それらのどれもこれらの型でこれらのオペランドを定義しない場合、代わりに定義できますか?

そうでない場合、新しいvector3クラスを作成する必要がありますか?

73
Joan Venge

これが頻繁に行われるもので、異なる操作を行う場合は、おそらくこのようなケースを処理するクラスを作成するか、 Numpy のようなライブラリを使用することをお勧めします。

それ以外の場合は、 リスト内包表記Zip 組み込み関数とともに使用します:

[a_i - b_i for a_i, b_i in Zip(a, b)]
117
UncleZeiv

リスト内包表記の代替手段を次に示します。 Mapはリスト(最後の引数)を繰り返し処理し、同時に実行し、それらの要素を引数として関数(最初の引数)に渡します。結果のリストを返します。

map(operator.sub, a, b)

このコードは、構文が少なく(私にとっては見た目が良い)、長さ5のリストのほうが40%高速であるためです(bobinceのコメントを参照)。それでも、どちらのソリューションでも機能します。

78
Nikhil Chelliah

リストがaとbの場合、次のことができます。

map(int.__sub__, a, b)

しかし、おそらくそうすべきではありません。誰もその意味を知りません。

12
recursive

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]]

ブーム。

10
mikelikespie

「a」と「b」という2つのリストがある場合、次のことができます。[m - n for m,n in Zip(a,b)]

6
Andy Mikula

わずかに異なる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)
4
S.Lott

単純な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
3
codelogic
import numpy as np
a = [2,2,2]
b = [1,1,1]
np.subtract(a,b)
2
user3503711

Pycharmでコーディングしていた人にとっては、他の人も復活します。

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

Python)のmaplambda関数の組み合わせは、この種の問題の良い解決策です。

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

@UncleZeivで示されているように、Zip関数も適切な選択肢です。

0
BioCoder