【python学習ノート】23:numpyのaddとmultiply

9823 ワード

addとmultiplyはnumpyで比較的よく使われる2つの演算で、それぞれ加算と乗算です.*かさんえんざん
>>> np.add.accumulate([1,2,3]) #  
array([1, 3, 6], dtype=int32)

累積np.add.accumulate()はpythonシーケンス(列がだめ)とnumpy配列に適用され、各位置の要素と前のすべての要素を加算して合計し、常にnumpy配列が得られる.
>>> np.add.reduce([1,2,3,4,5]) #  
15

続けてnp.add.reduce()は、すべての要素を加算して合計します.
>>> x=np.array([1,2,3,4])
>>> np.add.at(x,[0,2],3)
>>> x
array([4, 2, 6, 4])

np.add.at()は、入力された配列に下付き位置を定めた要素に指定された値を加算し、xに0と2の要素に3を加算すると、入力された配列xが変化する.
>>> np.add.outer([1,2,3],[4,5,6,7])
array([[ 5,  6,  7,  8],
       [ 6,  7,  8,  9],
       [ 7,  8,  9, 10]])

np.add.outer()は、1番目のリストまたは配列の各要素を2番目のリストまたは配列の各要素に順次追加し、各行を得る.
>>> x=np.arange(8)
>>> x
array([0, 1, 2, 3, 4, 5, 6, 7])
>>> np.add.reduceat(x,[0,4,1,5,2,6,3,7]) #      reduce  
array([ 6,  4, 10,  5, 14,  6, 18,  7], dtype=int32)

np.add.reduceat()は、入力された配列について、入力されたlist(2番目のパラメータ)によって指定された変化に従って、入力されたlistの数字がペアになって現れる.上記の例のようにx中の0,4部分のスライスをnpとする.add.reduce()演算(すなわち、加算)は、最初の位置に置かれ、次に2番目の位置は、xにおける下付き4の値、すなわち4である.
>>> x=np.linspace(0,15,16).reshape(4,4)
>>> x
array([[  0.,   1.,   2.,   3.],
       [  4.,   5.,   6.,   7.],
       [  8.,   9.,  10.,  11.],
       [ 12.,  13.,  14.,  15.]])
>>> np.add.reduceat(x,[0,3,1])
array([[ 12.,  15.,  18.,  21.],
       [ 12.,  13.,  14.,  15.],
       [ 24.,  27.,  30.,  33.]])

この例は2次元配列のreduceatの使い方であり、0->3はスライスであり、1->デフォルト下限はスライスであるため、得られた0行目の元の0行目+1行目+2行目、得られた1行目の元の3行目、得られた2行目の元の1行目+デフォルトの末尾、すなわち1行目+2行目+3行目である.総じて、redeceat関数が入力するindicesパラメータリストの各要素は、その後ろの要素がそれより大きいかどうかを見なければならない.それより大きい場合は、両者の間のスライスreduceを行い、逆に、それ自身が対応する要素がその結果である.最後のパラメータについては、その後要素がないため、最後のパラメータからデフォルトの最後までreduce結合することを規定します.次の例を見ることができます.
>>> np.add.reduceat(x,[0,3,1,1])
array([[ 12.,  15.,  18.,  21.],
       [ 12.,  13.,  14.,  15.],
       [  4.,   5.,   6.,   7.],
       [ 24.,  27.,  30.,  33.]])

4行はそれぞれ元の0->3スライス、3行、1行、1->デフォルトスライスです.
>>> np.add.reduceat(x,[0,3,1,3],axis=1) #      
array([[  3.,   3.,   3.,   3.],
       [ 15.,   7.,  11.,   7.],
       [ 27.,  11.,  19.,  11.],
       [ 39.,  15.,  27.,  15.]])

デフォルトパラメータaxis=0は行の計算を表し、上記の例ではaxisは1は列の計算を表し、左から右の4列はそれぞれ元の0->3列のスライス、3列、1->3列のスライス、3列である.
*乗算
>>> x=np.arange(8)
>>> x
array([0, 1, 2, 3, 4, 5, 6, 7])
>>> np.multiply.at(x,[0,1,2],5)
>>> x
array([ 0,  5, 10,  3,  4,  5,  6,  7])

乗算と加算のいくつかの関数の使い方は似ていますnp.multiply.at()は、xに0,1,2と下付きされた要素に5を乗じたように、ある配列の下付き要素に指定値を乗じたことを示す.これは元の配列を変更します.
>>> np.multiply.accumulate([1,2,3,4])
array([ 1,  2,  6, 24], dtype=int32)

np.multiply.accumulate()は累積乗算を表し、各要素はその前のすべての要素に乗算され、新しい配列を返します.
>>> np.multiply.outer([1,2,3],[4,5,6])
array([[ 4,  5,  6],
       [ 8, 10, 12],
       [12, 15, 18]])

np.multiply.outer()は、1番目のリストまたは配列の各要素を2番目のリストまたは配列の各要素に順次乗算し、各行を得ることを示す.
>>> np.multiply.reduce([1,2,3,4])
24

np.multiply.reduceは連乗を表し、すべての要素が乗算されます.2 Dの配列には、次のような使い方があります.
>>> np.multiply.reduce([[1,2,3,4],[5,6,7,8]])
array([ 5, 12, 21, 32])

これは縦方向(外部)reduceを表し,各サブ配列の対応するサブ要素を乗算して新しい配列を得る.
>>> np.multiply.reduce([[1,2,3,4],[5,6,7,8]],axis=1)
array([  24, 1680])

これは横方向の(内部)reduceを表し,各サブ配列は自分でreduceすればよい.
>>> x=np.linspace(0,15,16).reshape(4,4)
>>> x
array([[  0.,   1.,   2.,   3.],
       [  4.,   5.,   6.,   7.],
       [  8.,   9.,  10.,  11.],
       [ 12.,  13.,  14.,  15.]])
>>> np.multiply.reduceat(x,[0,3,1])
array([[    0.,    45.,   120.,   231.],
       [   12.,    13.,    14.,    15.],
       [  384.,   585.,   840.,  1155.]])

addのreduceat用法と同様に、この3行はそれぞれ元の行の0->3スライス、3行、1->デフォルトの末尾スライスである.
>>> np.multiply.reduceat(x,[0,3,1],axis=1)
array([[    0.,     3.,     6.],
       [  120.,     7.,   210.],
       [  720.,    11.,   990.],
       [ 2184.,    15.,  2730.]])

この3つの列は、元の列の0->3スライス、3列、1->デフォルトのスライスです.Multiplyのreduceat関数はすべて外部のreduceである.