2015-09-24 99 views
7

我正試圖從2D數組中切出行/列並獲取(col_size x 1)(1 x row_size)的數組。Numpy - 從數組中切片2d行或列向量

難道還有比每個切片後使用numpy.reshape()更簡單的方法?

乾杯, 斯蒂芬

+0

您能舉一個預期的輸入和輸出的例子嗎?你想獲得一維陣列還是二維陣列? –

+0

當然!假設我有一個類似'np.ones((2,40))'的數組。從這個數組中,我想以'np.array((1,40))'的形式對整行進行分割。結果應該是一個二維數組 – neurotronix

+1

使用np.newaxis或None來插入一個新的軸 –

回答

11

您可以切片並插入一個單一操作新軸。例如,這裏有一個2D陣列:

>>> a = np.arange(1, 7).reshape(2, 3) 
>>> a 
array([[1, 2, 3], 
     [4, 5, 6]]) 

切出單,切片(返回形狀(2, 1)陣列)與None作爲第三維度:

>>> a[:, 1, None] 
array([[2], 
     [5]]) 

切出一個單排(排列形狀爲(1, 3)),以None作爲第二維的切片:

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

非常感謝!正是我需要的!至少對我來說,Numpy真的非常棒,速度快,而且都非常直觀。 – neurotronix

+1

沒問題!索引/重新塑形需要一段時間來包裹頭部(至少對我來說是這樣),但經過一些練習之後纔有意義。 [docs](http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html)對解釋這裏發生的事情(* basic slicing *部分)非常有用。 –

+0

奇怪的是我從來沒有想過將索引和'None'加在一起。我想這只是習慣的力量,用'None'來擴展現有陣列的尺寸。而且速度更快。 – hpaulj

6

賺了指數片,列表或數組

X[[0],:] 
    X[0:1,4] 

但沒有什麼錯reshape比它需要打字的事實等。這並不慢。 [None,:]是一個很好的短手。

列表索引的使用可能是最短的,但它確實產生一個副本(正或負)並較慢

對於(100,100)整數數組:

In [487]: timeit x[[50],:] 
100000 loops, best of 3: 10.3 µs per loop # slowest 

In [488]: timeit x[50:51,:] 
100000 loops, best of 3: 2.24 µs per loop # slice indexing is fast 

In [489]: timeit x[50,:].reshape(1,-1) 
100000 loops, best of 3: 3.29 µs per loop # minimal time penalty 

In [490]: timeit x[50,:][None,:] 
100000 loops, best of 3: 3.55 µs per loop 

In [543]: timeit x[None,50,:]   # **best** 
1000000 loops, best of 3: 1.76 µs per loop 

一個用於複製測試是將數據緩衝區指針與原始數據進行比較。

In [492]: x.__array_interface__['data'] 
Out[492]: (175920456, False) 
In [493]: x[50,:].__array_interface__['data'] 
Out[493]: (175940456, False) 
In [494]: x[[50],:].__array_interface__['data'] 
Out[494]: (175871672, False) # different pointer 
In [495]: x[50:51,:].__array_interface__['data'] 
Out[495]: (175940456, False) 
In [496]: x[50,:][None,:].__array_interface__['data'] 
Out[496]: (175940456, False) 
+0

謝謝你隊友! – neurotronix

+0

問題是我正在實現一個可擴展的神經網絡,可根據圖層大小進行擴展。通過'reshape',我不得不經常訪問不同的實例屬性(例如圖層大小)。最後要說清楚的是:當我使用'a [0,None,:]'從'array' a中分割一行時,它會返回一個副本嗎? – neurotronix

+1

'[0,None,:''返回一個視圖。 – hpaulj

1

這個很好又簡單的方法怎麼樣?

In [73]: arr = (np.arange(5, 25)).reshape(5, 4) 

In [74]: arr 
Out[74]: 
array([[ 5, 6, 7, 8], 
     [ 9, 10, 11, 12], 
     [13, 14, 15, 16], 
     [17, 18, 19, 20], 
     [21, 22, 23, 24]]) 

# extract column 1 as a column vector 
In [79]: col1 = arr[:, [0]] 
In [80]: col1.shape 
Out[80]: (5, 1) 

In [81]: col1 
Out[81]: 
array([[ 5], 
     [ 9], 
     [13], 
     [17], 
     [21]]) 


# extract row 1 as a row vector 
In [82]: row1 = arr[[0], :] 

In [83]: row1.shape 
Out[83]: (1, 4) 

In [84]: row1 
Out[84]: array([[5, 6, 7, 8]]) 
+0

謝謝你的清晰和詳細的答案!但你沒有注意到這個問題已經兩年多了嗎?乾杯:) – neurotronix

+0

@neurotronix我剛剛意識到這一點。無論如何,由於教學原因,時間永遠不重要;) – kmario23

+0

非常真實的,謝謝你抽出時間來答覆! – neurotronix