2016-08-25 2 views
1

numpy.c_についてのドキュメントを何度も読んだけど、まだ混乱しています。それは言われています - "スライスオブジェクトを第2軸に沿った連結に変換します。"次のドキュメントを参照してください。以下の例では、スライスオブジェクトは何ですか、第2軸は何ですか?私はそれらがすべて一次元であり、第二の軸がどこから来ているのか混乱しているのを見る。numpy.c_のドキュメントとサンプルコードの混乱

WindowsでPython 2.7を使用しています。

http://docs.scipy.org/doc/numpy-1.6.0/reference/generated/numpy.c_.html#numpy.c_

>>> np.c_[np.array([[1,2,3]]), 0, 0, np.array([[4,5,6]])] 
array([[1, 2, 3, 0, 0, 4, 5, 6]]) 

答えて

8

np.c_出力形状は両方のケースで(1,8)である

In [701]: np.c_[np.array([[1,2,3]]), 0, 0, np.array([[4,5,6]])] 
Out[701]: array([[1, 2, 3, 0, 0, 4, 5, 6]]) 

In [702]: np.concatenate([np.array([[1,2,3]]), [[0]], [[0]], np.array([[4,5,6]])], 
    axis=1) 
Out[702]: array([[1, 2, 3, 0, 0, 4, 5, 6]]) 

を連結配列を行うための別の方法です。連結は2番目の軸である軸= 1にありました。

c_は、0からnp.array([[0]])への次元を拡張し、2d(1,1)を連結する必要がありました。

np.c_(およびnp.r_)は、実際には__getitem__メソッドを持つクラスオブジェクトです。したがって、[]構文で動作します。 numpy/lib/index_tricks.pyソースファイルは参考になります。 rowバージョンで扱う

注:1D(8)配列生成、スライス構文(同じ番号を、しかし1Dに)

In [706]: np.r_[1:4,0,0,4:7] 
Out[706]: array([1, 2, 3, 0, 0, 4, 5, 6]) 
In [708]: np.concatenate((np.arange(4),[0],[0],np.arange(4,7))) 
Out[708]: array([0, 1, 2, 3, 0, 0, 4, 5, 6]) 
In [710]: np.hstack((np.arange(4),0,0,np.arange(4,7))) 
Out[710]: array([0, 1, 2, 3, 0, 0, 4, 5, 6]) 

np.c_は便利ですが、ではない何かがあなたが必要としています理解する。私はconcatenateと直接作業できると思っています。これは、入力の次元について明示的に考えるよう強制します。

[[1,2,3]]は実際には1つのリストを含むリストです。 np.array([[1,2,3]])は、形状(1,3)を有する2次元アレイである。 np.arange(1,4)は同じ番号の(3、)配列を生成します。 np.arange(1,4)[None,:]はそれを(1,3)配列にします。

slice(1,4)はスライスオブジェクトです。 np.r_np.c_は、実際にnp.arangeを使用してスライスオブジェクトを配列に変換できます。

In [713]: slice(1,4) 
Out[713]: slice(1, 4, None) 
In [714]: np.r_[slice(1,4)] 
Out[714]: array([1, 2, 3]) 
In [715]: np.c_[slice(1,4)] # (3,1) array 
Out[715]: 
array([[1], 
     [2], 
     [3]]) 
In [716]: np.c_[1:4] # equivalent with the : notation 
Out[716]: 
array([[1], 
     [2], 
     [3]]) 

バック(最高ではないかもしれません)、元の例に取得する:np.c_については

In [722]: np.c_[[np.r_[1:4]],0,0,[np.r_[4:7]]] 
Out[722]: array([[1, 2, 3, 0, 0, 4, 5, 6]]) 

==========

In [731]: np.c_[np.ones((5,3)),np.random.randn(5,10)].shape 
Out[731]: (5, 13) 

を両方の第一次元が一致する必要があります。

例では、n_samplesX(行)の1番目の桁であり、randnもその数の行を持つ必要があります。

n_samples, n_features = X.shape 
X = np.c_[X, random_state.randn(n_samples, 200 * n_features)] 

np.concatenate([(X, randn(n_samples...)], axis=1)も同様です。やや細身ですが、機能的には同じです。

+0

ありがとうhpaulj、素敵な返信と投票アップ。実際に私の混乱はこのサンプルから来ています。この行の 'X = np.c_ [X、random_state.randn(n_samples、200 * n_features)] 'を参照してください。実際にはXの形状は150 * 4ですが、' random_state.randn'私はXと連結するために、150 * some_number_of_columnsの形状が必要だと思う? http://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html#multiclass-settings –

+1

右の 'n_samples'は' X'の第1次元なので、正しい次元でマッチします。 'X'と' randn'の列の数は異なるかもしれません。 – hpaulj

+0

ありがとうhpaulj、私はXが150 * 4の形だと思います、 'random_state.randn(n_samples、200 * n_features)'が150 * 4の形を出力できたのでしょうか?私は 'n_samples'が150であることを知っていますが、4つの部分はどこから来ましたか? –