2つのリストの要素ごとの乗算を実行する方法は?


137

Matlabでできるように、要素ごとの乗算を実行して、2つのリストをPythonで値で乗算します。

これは私がMatlabでそれを行う方法です。

a = [1,2,3,4]
b = [2,3,4,5]
a .* b = [2, 6, 12, 20]

リスト内包表記はx * yxfrom ayfromのすべての組み合わせに対して、16のリストエントリを提供します。bます。これをマッピングする方法がわからない。

なぜだれかに興味があるなら、私はデータセットを持っていて、それを掛け合わせたいですNumpy.linspace(1.0, 0.5, num=len(dataset)) =)


4
なぜ今あなたはnumpyについて今あなたにこれを尋ねているのですか?
pwuertz 2012

2
ちなみに、これは要素ごとの乗算であり、内積ではありません。
pwuertz 2012

3
別の方法:map(lambda x、y:x * y、list1、list2)#derp ...
xxjjnn

回答:


284

zip():と組み合わせたリスト内包表記を使用します。

[a*b for a,b in zip(lista,listb)]

9
一方、ここで些細な場合を超えて何かしたい場合、OPはNumpyを使用することをお勧めします。
Henry Gomersall 2012

1
Python 2では、izip()の方が適しています。
ヤク

23
も使用できますmap(lambda x,y:x*y,lista,listb)
mbomb007

listbタイプの要素のリストの代わりにlistb与えられ、単一のリストを取得するために操作する必要がある場合、答えはどのように変化しますか。例 (x、pi、e)with [(4、5、2)、(1、2、4)、(4、5、6)、(1、1、2)、(3、3、4)]、 (x、pi、e)を(4、5、2)で操作した後、(x、pi、e)を(1、2、4)で操作した場合...
gxyd 2017

@gxyd別の質問をする必要があります
mbomb007

87

すでにを使用numpyしているため、データをnumpyリストではなく配列に格納することは理にかなっています。これを行うと、要素ごとの製品などが無料で入手できます。

In [1]: import numpy as np

In [2]: a = np.array([1,2,3,4])

In [3]: b = np.array([2,3,4,5])

In [4]: a * b
Out[4]: array([ 2,  6, 12, 20])

1
おそらく最も科学的ではないかもしれませんが、私はこれをgahooaの回答に対してtimeitを使用して計時しました。Numpyは実際にはzipメソッドよりも少し遅いです。
チェイスロバーツ

1
リストにバイナリ値が含まれている私の場合、numpyソリューションはizipを使用するよりもはるかに高速でした。
セレンディピティ2015

グーグル検索からここに到着する他の人の利益のために、私は以下の時間比較を含めました。
paddyg 2016年

31

np.multiply(a、b)を使用します。

import numpy as np
a = [1,2,3,4]
b = [2,3,4,5]
np.multiply(a,b)

21

ループ内の各要素を乗算してみることができます。それを行うための短い手は

ab = [a[i]*b[i] for i in range(len(a))]

Stackoverflowへようこそ!コードのみの回答は通常お勧めしません-これが質問者の質問をどのように解決するかについて説明を追加してください。
Corley Brigman、2014年

7
@CorleyBrigman同意しない。「これを行う方法は次のとおりです:<code>」と「<code>」だけの答えにはほとんど違いがありません。この特定の状況では、「このコードで問題が解決する」以外に説明することはほとんどありません。
icedtrees 2014年

4
@CorleyBrigman同意しない。結果を表示するデータの例は、実際にはもっと役立つでしょう
Tjorriemorrie 2014年

2
これは、Pythonの初心者であるC、C ++、またはJavaプログラマーが問題を解決する方法です。受け入れ答えは、慣用的なPythonのです。
デビッドカレン

@Tjorriemorrie質問で明示的に要求されているため、結果は明確です。おそらく、リスト内包表記がどのように機能するかについての説明は良いかもしれませんし、これがリスト内包表記を利用していて、誰もがそれを知らなければ、それを調べることができることを言及することもできます。
xuiqzy

10

さらに別の答え:

-1...インポートが必要
+1...非常に読みやすい

import operator
a = [1,2,3,4]
b = [10,11,12,13]

list(map(operator.mul, a, b))

出力[10、22、36、52]


あなたが地図を知っているなら、これは本当に読みやすい解決策です!インポートは、ファイルの先頭にあることを除いて、何か悪影響がありますか?(エディターは必要に応じてインポートを非表示にすることができます)私の知る限り、すべてのpython 2および3バージョンで使用できるはずです!
xuiqzy

9

これを行うかなり直感的な方法:

a = [1,2,3,4]
b = [2,3,4,5]
ab = []                        #Create empty list
for i in range(0, len(a)):
     ab.append(a[i]*b[i])      #Adds each element to the list

9

あなたは使用して乗算することができます lambda

foo=[1,2,3,4]
bar=[1,2,5,55]
l=map(lambda x,y:x*y,foo,bar)

4

大きなリストの場合は、それをイタリー方式で実行できます。

product_iter_object = itertools.imap(operator.mul, [1,2,3,4], [2,3,4,5])

product_iter_object.next() 出力リストの各要素を提供します。

出力は、2つの入力リストのうち短い方の長さになります。


4

1の配列を作成します。各リストに配列を掛けます。配列をリストに変換する

import numpy as np

a = [1,2,3,4]
b = [2,3,4,5]

c = (np.ones(len(a))*a*b).tolist()

[2.0, 6.0, 12.0, 20.0]

3

gahooaの答えは見出しで述べられている質問に対して正しいですが、リストがすでに乱暴な形式または 10よりも大きい場合、それがはるかに高速(3桁)で読みやすくなり、 NPE。私はこれらのタイミングを取得します:

0.0049ms -> N = 4, a = [i for i in range(N)], c = [a*b for a,b in zip(a, b)]
0.0075ms -> N = 4, a = [i for i in range(N)], c = a * b
0.0167ms -> N = 4, a = np.arange(N), c = [a*b for a,b in zip(a, b)]
0.0013ms -> N = 4, a = np.arange(N), c = a * b
0.0171ms -> N = 40, a = [i for i in range(N)], c = [a*b for a,b in zip(a, b)]
0.0095ms -> N = 40, a = [i for i in range(N)], c = a * b
0.1077ms -> N = 40, a = np.arange(N), c = [a*b for a,b in zip(a, b)]
0.0013ms -> N = 40, a = np.arange(N), c = a * b
0.1485ms -> N = 400, a = [i for i in range(N)], c = [a*b for a,b in zip(a, b)]
0.0397ms -> N = 400, a = [i for i in range(N)], c = a * b
1.0348ms -> N = 400, a = np.arange(N), c = [a*b for a,b in zip(a, b)]
0.0020ms -> N = 400, a = np.arange(N), c = a * b

つまり、次のテストプログラムから。

import timeit

init = ['''
import numpy as np
N = {}
a = {}
b = np.linspace(0.0, 0.5, len(a))
'''.format(i, j) for i in [4, 40, 400] 
                  for j in ['[i for i in range(N)]', 'np.arange(N)']]

func = ['''c = [a*b for a,b in zip(a, b)]''',
'''c = a * b''']

for i in init:
  for f in func:
    lines = i.split('\n')
    print('{:6.4f}ms -> {}, {}, {}'.format(
           timeit.timeit(f, setup=i, number=1000), lines[2], lines[3], f))

3

列挙を使用できます。

a = [1, 2, 3, 4]
b = [2, 3, 4, 5]

ab = [val * b[i] for i, val in enumerate(a)]

3

このmap関数はここで非常に役立ちます。を使用mapすると、イテラブルの各要素に任意の関数を適用できます。

Python 3.x

>>> def my_mul(x,y):
...     return x*y
...
>>> a = [1,2,3,4]
>>> b = [2,3,4,5]
>>>
>>> list(map(my_mul,a,b))
[2, 6, 12, 20]
>>>

もちろん:

map(f, iterable)

に相当

[f(x) for x in iterable]

そのため、次の方法でソリューションを取得できます。

>>> [my_mul(x,y) for x, y in zip(a,b)]
[2, 6, 12, 20]
>>>

Python 2.xでのmap()意味:イテラブルの各要素に関数を適用し、新しいリストを作成します。Python 3.x mapでは、リストの代わりにイテレータを作成します。

代わりに、演算子my_mulを使用できます mul

Python 2.7

>>>from operator import mul # import mul operator
>>>a = [1,2,3,4]
>>>b = [2,3,4,5]
>>>map(mul,a,b)
[2, 6, 12, 20]
>>>

Python 3.5以降

>>> from operator import mul
>>> a = [1,2,3,4]
>>> b = [2,3,4,5]
>>> [*map(mul,a,b)]
[2, 6, 12, 20]
>>>

map()イテレータを構築する*ため、リストを取得するために反復可能なアンパッキング演算子を使用していることに注意してください。解凍方法はlistコンストラクタよりも少し高速です:

>>> list(map(mul,a,b))
[2, 6, 12, 20]
>>>

1

リストのタイプを維持し、1行で実行するには(もちろん、numpyをnpとしてインポートした後):

list(np.array([1,2,3,4]) * np.array([2,3,4,5]))

または

list(np.array(a) * np.array(b))

0

これは同じ長さのリストに使用できます

def lstsum(a, b):
    c=0
    pos = 0
for element in a:
   c+= element*b[pos]
   pos+=1
return c
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.