web-dev-qa-db-ja.com

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

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

これが私がMatlabでやる方法です。

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

リスト内包表記は、xからのayからのbの組み合わせx * yごとに、16個のリスト項目を与えます。これをマッピングする方法がわからない。

誰もがその理由に興味があるなら、私はデータセットを持っていて、それにNumpy.linspace(1.0, 0.5, num=len(dataset)) =)を掛けたいです。

109
xxjjnn

Zip():と混合したリスト内包表記を使用してください。

[a*b for a,b in Zip(lista,listb)]
230
gahooa

すでに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])
76
NPE

Np.multiply(a、b)を使用してください。

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

あなたはループ内の各要素を掛けてみることができます。そのための簡単な方法は

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

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

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

もう一つの答え:

-1 ...はインポートが必要です
+1 ...はとても読みやすいです

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

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

出力[10、22、36、52]

6
Petr Vepřek

lambdaを使って乗算できます

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

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

大規模なリストの場合は、それを賢いやり方で行うことができます。

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

product_iter_object.next()は出力リストの各要素を与えます。

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

3
aady

gahooaの答えは見出しの中で表現されているように質問に対して正しいですが、リストがすでにでたらめなフォーマットであるならまたは 10より大きいNPEで提案されているように、単純ででこぼこした乗算を行うのは、はるかに速く(3桁)、さらに読みやすくなります。私はこれらのタイミングを得ます:

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))
2
paddyg

ここでは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
sg7

リストの種類を維持し、一行でそれを行うには(もちろん、numpyをnpとしてインポートした後):

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

または

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

列挙を使用することができます。

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

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

同じ長さのリストにこれを使うことができます

def lstsum(a, b):
    c=0
    pos = 0
for element in a:
   c+= element*b[pos]
   pos+=1
return c
0
WOX GAMER