Matlabでできるように、2つのリストをPythonの値で乗算するために、要素ごとの乗算を実行したいと思います。
これが私がMatlabでやる方法です。
a = [1,2,3,4]
b = [2,3,4,5]
a .* b = [2, 6, 12, 20]
リスト内包表記は、x
からのa
とy
からのb
の組み合わせx * y
ごとに、16個のリスト項目を与えます。これをマッピングする方法がわからない。
誰もがその理由に興味があるなら、私はデータセットを持っていて、それにNumpy.linspace(1.0, 0.5, num=len(dataset)) =)
を掛けたいです。
Zip()
:と混合したリスト内包表記を使用してください。
[a*b for a,b in Zip(lista,listb)]
すでに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])
Np.multiply(a、b)を使用してください。
import numpy as np
a = [1,2,3,4]
b = [2,3,4,5]
np.multiply(a,b)
あなたはループ内の各要素を掛けてみることができます。そのための簡単な方法は
ab = [a[i]*b[i] for i in range(len(a))]
これを行うかなり直感的な方法:
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
もう一つの答え:
-1
...はインポートが必要です+1
...はとても読みやすいです
import operator
a = [1,2,3,4]
b = [10,11,12,13]
list(map(operator.mul, a, b))
出力[10、22、36、52]
lambda
を使って乗算できます
foo=[1,2,3,4]
bar=[1,2,5,55]
l=map(lambda x,y:x*y,foo,bar)
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]
大規模なリストの場合は、それを賢いやり方で行うことができます。
product_iter_object = itertools.imap(operator.mul, [1,2,3,4], [2,3,4,5])
product_iter_object.next()
は出力リストの各要素を与えます。
出力は、2つの入力リストのうち短い方の長さになります。
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))
ここでは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]
>>>
リストの種類を維持し、一行でそれを行うには(もちろん、numpyをnpとしてインポートした後):
list(np.array([1,2,3,4]) * np.array([2,3,4,5]))
または
list(np.array(a) * np.array(b))
列挙を使用することができます。
a = [1, 2, 3, 4]
b = [2, 3, 4, 5]
ab = [val * b[i] for i, val in enumerate(a)]
同じ長さのリストにこれを使うことができます
def lstsum(a, b):
c=0
pos = 0
for element in a:
c+= element*b[pos]
pos+=1
return c