3

次元 MxN の配列 H と次元 M の配列 A があります。配列 A で H 行をスケーリングしたいのですが、Numpy の要素単位の動作を利用して、このようにします。

H = numpy.swapaxes(H, 0, 1)
H /= A
H = numpy.swapaxes(H, 0, 1)

それは機能しますが、2 つの swapaxes 操作はあまりエレガントではありません。一時的なものを作成せずに、結果を達成するためのよりエレガントで簡潔な方法があると思います。方法を教えてください ?

4

2 に答える 2

5

単純に使用できると思いますH/A[:,None]

In [71]: (H.swapaxes(0, 1) / A).swapaxes(0, 1)
Out[71]: 
array([[  8.91065496e-01,  -1.30548362e-01,   1.70357901e+00],
       [  5.06027691e-02,   3.59913305e-01,  -4.27484490e-03],
       [  4.72868136e-01,   2.04351398e+00,   2.67527572e+00],
       [  7.87239835e+00,  -2.13484271e+02,  -2.44764975e+02]])

In [72]: H/A[:,None]
Out[72]: 
array([[  8.91065496e-01,  -1.30548362e-01,   1.70357901e+00],
       [  5.06027691e-02,   3.59913305e-01,  -4.27484490e-03],
       [  4.72868136e-01,   2.04351398e+00,   2.67527572e+00],
       [  7.87239835e+00,  -2.13484271e+02,  -2.44764975e+02]])

None(または)次元でnewaxis拡張するため(リンクの例)A

In [73]: A
Out[73]: array([ 1.1845468 ,  1.30376536, -0.44912446,  0.04675434])

In [74]: A[:,None]
Out[74]: 
array([[ 1.1845468 ],
       [ 1.30376536],
       [-0.44912446],
       [ 0.04675434]])
于 2013-02-01T03:22:23.913 に答える
2

A適切にブロードキャストされるように、形状を変更するだけです。

A = A.reshape((-1, 1))

それで:

In [21]: M
Out[21]: 
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11],
       [12, 13, 14],
       [15, 16, 17],
       [18, 19, 20]])


In [22]: A
Out[22]: array([1, 2, 3, 4, 5, 6, 7])


In [23]: M / A.reshape((-1, 1))
Out[23]: 
array([[0, 1, 2],
       [1, 2, 2],
       [2, 2, 2],
       [2, 2, 2],
       [2, 2, 2],
       [2, 2, 2],
       [2, 2, 2]])
于 2013-02-01T03:22:08.880 に答える