[英]Numpy - slicing 2d row or column vector from array
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)
. 我试图找到一个巧妙的小技巧,用于从2d数组切片行/列并获得(col_size x 1)
或(1 x row_size)
。
Is there an easier way than to use numpy.reshape()
after every slicing? 有没有比在每次切片后使用numpy.reshape()
更简单的方法?
Cheers, Stephan 干杯,斯蒂芬
You can slice and insert a new axis in one single operation. 您可以在一次操作中切片并插入新轴。 For example, here's a 2D array: 例如,这是一个2D数组:
>>> 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: 要切出单个列 (返回形状(2, 1)
数组),请将None
作为第三个维度切片:
>>> 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: 要切出单个行 (返回形状的数组(1, 3)
),请将None
作为第二个维度切片:
>>> 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. 但除了需要打字这一事实外, reshape
没有任何问题。 It isn't slow. 它并不慢。 [None,:]
is a nice short hand for it. [None,:]
是一个很好的短手。
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: 对于(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
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)
How about this nice and easy way? 这个简单明了的方法怎么样?
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]])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.