[翻译]  Numpy - slicing 2d row or column vector from array

[CHINESE]  Numpy - 从数组中切割2d行或列向量

I'm trying to find a neat little trick for slicing a row/column from a 2d array and obtaining an array of `(col_size x 1)` or `(1 x row_size)`.

Is there an easier way than to use `numpy.reshape()` after every slicing?

Cheers, Stephan

3 个解决方案

#1

13

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)
>>> a
array([[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]])
``````

#2

6

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  # 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
``````

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

#3

3

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