pythonで行ベクトルと列ベクトルを区別する良い方法はありますか?今のところ、numpyとscipyを使っていますが、ベクトルを与える場合、例えば
from numpy import *
Vector = array([1,2,3])
行ベクトルか列ベクトルかわからないということです。さらに
array([1,2,3]) == array([1,2,3]).transpose()
True
quot;現実の世界では、これは単に真実ではありません。
言及したモジュールのベクトルに対する関数のほとんどは微分を必要としないことは理解しています。例えばouter(a,b)
やa.dot(b)
のようなものですが、私は自分の便宜のために微分したいのです。
配列に別の次元を追加することで、区別を明確にすることができる。
>>> a = np.array([1, 2, 3])
>>> a
array([1, 2, 3])
>>> a.transpose()
array([1, 2, 3])
>>> a.dot(a.transpose())
14
今度は強制的に列ベクトルにします:
>>> a.shape = (3,1)
>>> a
array([[1],
[2],
[3]])
>>> a.transpose()
array([[1, 2, 3]])
>>> a.dot(a.transpose())
array([[1, 2, 3],
[2, 4, 6],
[3, 6, 9]])
別の方法として、区別したいときにnp.newaxisを使うこともできる:
>>> a = np.array([1, 2, 3])
>>> a
array([1, 2, 3])
>>> a[:, np.newaxis]
array([[1],
[2],
[3]])
>>> a[np.newaxis, :]
array([[1, 2, 3]])
作成するベクトルは行でも列でもないです。 実際には1次元のみです。 あなたはそれを確認することができます。
-寸法数「myvector.ndim」(「1」)を確認します。
-(3)
である myvector.shape
をチェックします(要素が1つだけのタプル)。 行のベクトルは「(1、3)」であり、列は「(3、1)」である必要があります。
これを処理する2つの方法。
-実際の行または列ベクトルを作成します。 -あなたの現在のものを「再形成」してください。
行または列を明示的に作成できます。
row = np.array([ # one row with 3 elements
[1, 2, 3]
]
column = np.array([ # 3 rows, with 1 element each
[1],
[2],
[3]
])
または、ショートカット付き。
row = np.r_['r', [1,2,3]] # shape: (1, 3)
column = np.r_['c', [1,2,3]] # shape: (3,1)
または、行の場合は「(1、n)」、列の場合は「(n、1)」に再形成することもできます。
row = my_vector.reshape(1, -1)
column = my_vector.reshape(-1, 1)
ここで、 -1
は n
の値を自動的に検出します。
もしこのケースでディスティクションが必要なら、代わりに行列
を使うことをお勧めする:
matrix([1,2,3]) == matrix([1,2,3]).transpose()
が得られます:
matrix([[ True, False, False],
[False, True, False],
[False, False, True]], dtype=bool)
また、ndarray
を使って明示的に2つ目の次元を追加することもできる:
array([1,2,3])[None,:]
#array([[1, 2, 3]])
とします:
array([1,2,3])[:,None]
#array([[1],
# [2],
# [3]])
1x3配列、または3x1配列が必要な場合:
import numpy as np
row_arr = np.array([1,2,3]).reshape((1,3))
col_arr = np.array([1,2,3]).reshape((3,1)))
あなたの仕事をチェックしてください:
row_arr.shape #returns (1,3)
col_arr.shape #returns (3,1)
ここで多くの答えが参考になると思いましたが、私には複雑すぎます。 実際には、「shape」と「reshape」に戻り、コードは読みやすく、非常にシンプルで明確です。
numpyを使用して w ^ T * x
を計算しようとしたとき、それは私にとっても非常に混乱しました。 実際、自分で実装することはできませんでした。 これは、NumPyで数少ないゲッチャの1つです。
次の例を見てください。すべてのケースで同じ結果が得られますが、これは(の理論的な意味)線形代数には当てはまりません。
In [37]: w
Out[37]: array([0, 1, 2, 3, 4])
In [38]: x
Out[38]: array([1, 2, 3, 4, 5])
In [39]: np.dot(w, x)
Out[39]: 40
In [40]: np.dot(w.transpose(), x)
Out[40]: 40
In [41]: np.dot(w.transpose(), x.transpose())
Out[41]: 40
In [42]: np.dot(w, x.transpose())
Out[42]: 40
--------------------------。
その情報を使用して、ベクトル | w | ^ 2
の2乗長を計算してみましょう。
そのためには、「w」を2D配列に変換する必要があります。
In [51]: wt = w[:, np.newaxis]
In [52]: wt
Out[52]:
array([[0],
[1],
[2],
[3],
[4]])
次に、ベクトル w
の2乗長(または2乗等級)を計算します。
In [53]: np.dot(w, wt)
Out[53]: array([30])
np.dot(wt、w)を使用した形状の不一致のため、「wt」、「w」の代わりに「w」、 wt
を使用したことに注意してください(理論上の線形代数の場合と同様)。 したがって、ベクトルの2乗の長さは「[30]」です。 多分これは行と列のベクトルを区別する(ナンピーの解釈)方法の1つです?
そして最後に、「w ^ T * x」を実装する方法を理解したことを述べましたか。 ? はい、しました。
In [58]: wt
Out[58]:
array([[0],
[1],
[2],
[3],
[4]])
In [59]: x
Out[59]: array([1, 2, 3, 4, 5])
In [60]: np.dot(x, wt)
Out[60]: array([40])
したがって、NumPyでは、上記のように、理論上の線形代数で研究したものとは逆に、オペランドの順序が逆になります。
------------------。
PS :numpyの潜在的な落とし穴。