2016-08-25 82 views
1

我多次閱讀關於numpy.c_的文檔,但仍然感到困惑。據說 - 「將切片對象翻譯爲沿着第二軸的連接」。在下面的文件中。任何人都可以在下面的例子中闡明什麼是切片對象,什麼是第二軸?我發現它們都是一個維度,並且混淆了第二軸從哪裏來。關於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_是做陣列的另一種方式串聯

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

輸出形狀是在兩種情況下(1,8);級聯在軸= 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]]實際上是一個列表 - 一個包含一個列表的列表。 np.array([[1,2,3]])是一個具有形狀(1,3)的二維數組。 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]]) 

而且要回到最初的例子(這可能不是最好的):

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) 

對於np.c_兩者的第一維需要匹配。

learn示例中,n_samplesX(行)的第1個dim,而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'的第一個維度,所以它們將在正確的維度上匹配。 'X'和'randn'的列數可以不同。 – hpaulj

+0

謝謝hpaulj,我覺得X是150 * 4形狀,怎麼能'random_state.randn(n_samples,200 * n_features)'輸出150 * 4形狀?我知道'n_samples'是150,但是從哪裏來的? –