Numpy - slicing 2d row or column vector from array
You can slice and insert a new axis in one single operation. For example, here's a 2D array:
>>> a = np.arange(1, 7).reshape(2, 3)>>> aarray([[1, 2, 3], [4, 5, 6]])
To slice out a single column (returning array of shape (2, 1)
), slice with None
as the third dimension:
>>> a[:, 1, None]array([[2], [5]])
To slice out a single row (returning array of shape (1, 3)
), slice with None
as the second dimension:
>>> a[0, None, :]array([[1, 2, 3]])
Make the index a slice, list or array
X[[0],:] X[0:1,4]
But there's nothing wrong with reshape
other than the fact that it requires typing. It isn't slow. [None,:]
is a nice short hand for it.
Use of a list index may be the shortest, but it does produce a copy (a plus or minus?) and is slower
For (100,100)
integer array:
In [487]: timeit x[[50],:]100000 loops, best of 3: 10.3 µs per loop # slowestIn [488]: timeit x[50:51,:]100000 loops, best of 3: 2.24 µs per loop # slice indexing is fastIn [489]: timeit x[50,:].reshape(1,-1)100000 loops, best of 3: 3.29 µs per loop # minimal time penaltyIn [490]: timeit x[50,:][None,:]100000 loops, best of 3: 3.55 µs per loopIn [543]: timeit x[None,50,:] # **best**1000000 loops, best of 3: 1.76 µs per loop
One test for copy is to compare the data buffer pointer with the original.
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 pointerIn [495]: x[50:51,:].__array_interface__['data']Out[495]: (175940456, False)In [496]: x[50,:][None,:].__array_interface__['data']Out[496]: (175940456, False)
How about this nice and easy way?
In [73]: arr = (np.arange(5, 25)).reshape(5, 4)In [74]: arrOut[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 vectorIn [79]: col1 = arr[:, [0]]In [80]: col1.shapeOut[80]: (5, 1)In [81]: col1Out[81]: array([[ 5], [ 9], [13], [17], [21]])# extract row 1 as a row vectorIn [82]: row1 = arr[[0], :]In [83]: row1.shapeOut[83]: (1, 4)In [84]: row1Out[84]: array([[5, 6, 7, 8]])