2013-07-02 21 views
29

Pythonの行ベクトルと列ベクトルを区別する良い方法はありますか?これまでのところ私はnumpyのとscipyのダウンロードを使用して、何私がこれまで見、私はベクトルを1与えることだった場合、彼らは私が行または列を意味天候と言うことができないだろうPython:行ベクトルと列ベクトルを区別する

from numpy import * 
Vector = array([1,2,3]) 

言うことですよベクター。さらに:

array([1,2,3]) == array([1,2,3]).transpose() 
True 

「現実の世界」は単に真実ではありません。 私は、上記のモジュールからのベクトル上の関数のほとんどは、微分を必要としないことを認識しています。たとえばouter(a,b)またはa.dot(b)ですが、自分の便宜のために区別したいと思います。

+3

をあなたが観察している行動は、現実の世界では」実際に*正しい*です":a * one *次元の数列は行でも列ベクトルでもありません。行ベクトルまたは列ベクトルは実際には* 2次元の配列(2次元の1つが1)です。したがって、代わりに 'array([[1、2、3]])'でテストしなければなりません。これはその転置と同じではありません。 – EOL

+0

これは実際には数学的にはあまり正しくありません。行列はmxnであり、行ベクトルは定義上、m = 1であり、列ベクトルはn = 1である行列である。次元数は数学ではまったく異なり、ベクトル空間のベーシスセットに含まれるベクトルの数に関係しているので、実際には単一のベクトルの次元性については話してはいけません。私は、「現実の世界」を話す際の元のポスターは、線形代数と数学の世界について話していたと思います。プログラマーは間違った用語を使用する傾向があります。 – neuronet

答えて

39

他のディメンションを配列に追加することで、区別を明示的にすることができます。

>>> 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]]) 
+0

私はそれについて考えましたが、それは__getitem__が矛盾することを意味します:列ベクトルの 'a [0] = [1]'、 'a [0] [0] = 1'、' a [0] a [0] [0] = TypeError'行ベクトルです。 – MarcinKonowalczyk

+2

はい、これは考慮する必要のないトレードオフです。もう一つの選択肢は、区別が必要なときにnp.newaxisを使用することです(私の答えを編集するを参照)。 – bogatron

+0

行ベクトル(1d配列)を列ベクトル(コピーを返します)に変換する別の方法: 'a.reshape(a.size、1)'、または 'a.reshape(-1、1)'私は –

1

あなたはコンテキストでそれを使用しない限り、Pythonのnumpyのは、それを区別していないように見えます:「あなたが好きな場合は、標準のベクトルや行/列ベクトルを持つことができる」

「:)あなたができますdot(A、v)はvを列ベクトルとして扱いますが、dot(v、A)はvを行ベクトルとして扱います。 "

また、コードに固有の:「ランク1配列の転置は何もしません」 ソース: http://wiki.scipy.org/NumPy_for_Matlab_Users

+0

私はそれを知っています。私はそれらを差別化する方法が欲しい。多分他の数学モジュールですか? – MarcinKonowalczyk

3

をこの場合、私は代わりにmatrixを使用することをお勧めします。

matrix([1,2,3]) == matrix([1,2,3]).transpose() 

ができます:

array([1,2,3])[None,:] 
#array([[1, 2, 3]]) 

と::

array([1,2,3])[:,None] 
#array([[1], 
#  [2], 
#  [3]]) 
+0

'array([1,2,3])[なし、:]'は明示的な 'array([[1,2,3]])'よりはるかに複雑です。 – EOL

+2

'matrix'は一般的に避けてください。高次元に一般化されないので、 – Eric

0

優れたPandasライブラリを作るnumpyのに機能を追加し

matrix([[ True, False, False], 
     [False, True, False], 
     [False, False, True]], dtype=bool) 

また、明示的に二次元を追加ndarrayを使用することができますこれらの操作はより直感的なIMOです。例:

import numpy as np 
import pandas as pd 

# column 
df = pd.DataFrame([1,2,3]) 

# row 
df2 = pd.DataFrame([[1,2,3]]) 

define a DataFrame and make a spreadsheet-like pivot tableでも可能です。

+2

NumPyで同じことを書くことができるので、' df [0] = 10'と 'df2 [0 ] = 10'は、行ベクトルと列ベクトルを考えるときに期待どおりに動作します。これは、NumPyに比べ、Pandasが便利な場所です。 – EOL

1

あなたはnumpy.arrayのndminオプションを使うことができると思います。 2にすると、それは(4,1)になり、転置は(1,4)になります。

私はnumpyのを使用して w^T * xを計算しようとしたとき、それは同様に私のスーパー混乱だった
>>> a = np.array([12, 3, 4, 5], ndmin=2) 
>>> print a.shape 
>>> (1,4) 
>>> print a.T.shape 
>>> (4,1) 
0

。実際、私はそれを自分で実装することはできませんでした。だから、これは私たちが自分自身に熟知する必要があるNumPyのいくつかの落書きの一つです。

限り1Dアレイに関しては、行ベクトルと列ベクトル間区別はありません。彼らはまったく同じです。

線形代数では真実ではありません、我々はすべてのケースで同じ結果を取得するには、次の例、を見て、(の理論的な感覚):その情報に基づいて

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の二乗長さ(または乗大きさ)を計算してみましょう:

In [53]: np.dot(w, wt) 
Out[53]: array([30]) 

私たちが代わりにwtwwtを使用注意、w(理論的な線形代数のように) np.dot(wt、w)の使用による形状の不一致が原因です。したがって、ベクトルの2乗の長さは[30]です。たぶんこれは行と列のベクトル(numpyの解釈)を区別する方法の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の中で、オペランドの順序は、逆転されます。


P.S.potential gotchas in numpy

+0

1次元配列のリストで 'np.hstack'または' np.vstack'を実行しようとすると、実際に違いが生じます!各配列の形状が '(10、)'の場合、 'hstack'の結果は'(20、) '、' vstack'の場合は '(2、10)'です。つまり、列ベクトルとみなされます。 –

0

これは別の直感的な方法です。我々が持っていると仮定します。

>>> a = np.array([1, 3, 4]) 
>>> a 
array([1, 3, 4]) 

まず、我々は唯一の行としてそれと2D配列ます

>>> a = np.array([a]) 
>>> a 
array([[1, 3, 4]]) 

をその後、我々はそれを移調することができます

>>> a.T 
array([[1], 
     [3], 
     [4]]) 
6

使用ダブル[]あなたを書きますベクター。その後

、あなたが行ベクトルたい場合:

row_vector = array([[1, 2, 3]]) # shape (1, 3) 

をそれとも、列ベクトルたい場合:

col_vector = array([[1, 2, 3]]).T # shape (3, 1) 
関連する問題