我正试图从2D数组中切出行/列并获取(col_size x 1)
或(1 x row_size)
的数组。Numpy - 从数组中切片2d行或列向量
难道还有比每个切片后使用numpy.reshape()
更简单的方法?
干杯, 斯蒂芬
我正试图从2D数组中切出行/列并获取(col_size x 1)
或(1 x row_size)
的数组。Numpy - 从数组中切片2d行或列向量
难道还有比每个切片后使用numpy.reshape()
更简单的方法?
干杯, 斯蒂芬
您可以切片并插入一个单一操作新轴。例如,这里有一个2D阵列:
>>> 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真的非常棒,速度快,而且都非常直观。 – neurotronix
没问题!索引/重新塑形需要一段时间来包裹头部(至少对我来说是这样),但经过一些练习之后才有意义。 [docs](http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html)对解释这里发生的事情(* basic slicing *部分)非常有用。 –
奇怪的是我从来没有想过将索引和'None'加在一起。我想这只是习惯的力量,用'None'来扩展现有阵列的尺寸。而且速度更快。 – hpaulj
赚了指数片,列表或数组
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)
谢谢你队友! – neurotronix
问题是我正在实现一个可扩展的神经网络,可根据图层大小进行扩展。通过'reshape',我不得不经常访问不同的实例属性(例如图层大小)。最后要说清楚的是:当我使用'a [0,None,:]'从'array' a中分割一行时,它会返回一个副本吗? – neurotronix
'[0,None,:''返回一个视图。 – hpaulj
这个很好又简单的方法怎么样?
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
@neurotronix我刚刚意识到这一点。无论如何,由于教学原因,时间永远不重要;) – kmario23
非常真实的,谢谢你抽出时间来答复! – neurotronix
您能举一个预期的输入和输出的例子吗?你想获得一维阵列还是二维阵列? –
当然!假设我有一个类似'np.ones((2,40))'的数组。从这个数组中,我想以'np.array((1,40))'的形式对整行进行分割。结果应该是一个二维数组 – neurotronix
使用np.newaxis或None来插入一个新的轴 –