Numpy - slicing 2d row or column vector from array Numpy - slicing 2d row or column vector from array numpy numpy

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