Numpy - 从数组中切片二维行或列向量
Posted
技术标签:
【中文标题】Numpy - 从数组中切片二维行或列向量【英文标题】:Numpy - slicing 2d row or column vector from array 【发布时间】:2015-12-22 05:23:48 【问题描述】:我正在尝试找到一个巧妙的小技巧,用于从二维数组中分割行/列并获得 (col_size x 1)
或 (1 x row_size)
的数组。
有没有比在每次切片后使用numpy.reshape()
更简单的方法?
干杯, 斯蒂芬
【问题讨论】:
你能提供一个预期输入和输出的例子吗?你要获取一维数组还是二维数组? 当然!假设我有一个像np.ones((2,40))
这样的数组。我想从这个数组中以np.array((1,40))
的形式切片一整行。结果应该是一个二维数组
使用 np.newaxis 或 None 插入新轴
【参考方案1】:
您可以在一次操作中切片和插入新轴。例如,这是一个二维数组:
>>> 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]])
【讨论】:
非常感谢!正是我需要的! Numpy 真的很棒而且速度很快,但不是很直观,至少对我来说是这样。 没问题!索引/重塑需要一段时间才能理解(至少对我来说是这样),但经过一些练习后才有意义。 docs 非常适合解释这里发生的事情(基本切片部分)。 奇怪的是,我从未想过将索引与None
添加相结合。我想这只是习惯的力量,使用None
来扩展现有数组的维度。而且速度更快。【参考方案2】:
将索引设为切片、列表或数组
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)
【讨论】:
问题是我正在实现一个可扩展的神经网络,在层大小方面是可扩展的。使用reshape
,我不得不经常访问不同的实例属性(例如层大小)。终于做对了:当我使用a[0, None, :]
从array
a 中切出一行时,它会返回一个副本吗?
[0, None, :]
返回一个视图。【参考方案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]])
【讨论】:
感谢您干净而详细的回答!但是你有没有注意到这个问题已经超过两年了?干杯:) @neurotronix 我才意识到这一点。无论如何,出于教学原因,时间并不重要;) 非常正确,感谢您抽出宝贵时间提供答案!以上是关于Numpy - 从数组中切片二维行或列向量的主要内容,如果未能解决你的问题,请参考以下文章