我試圖訪問numpy ndarray的角落值。對於方法論我絕對難以理解。任何幫助將不勝感激。在Python中獲取角落值numpy ndarray
例如,從下面的數組我想要一個返回值的數組([1,0,0,5])或數組([[1,0],[0,5]])。
array([[ 1., 0., 0., 0.],
[ 0., 1., 0., 0.],
[ 0., 0., 1., 5.],
[ 0., 0., 5., 5.]])
我試圖訪問numpy ndarray的角落值。對於方法論我絕對難以理解。任何幫助將不勝感激。在Python中獲取角落值numpy ndarray
例如,從下面的數組我想要一個返回值的數組([1,0,0,5])或數組([[1,0],[0,5]])。
array([[ 1., 0., 0., 0.],
[ 0., 1., 0., 0.],
[ 0., 0., 1., 5.],
[ 0., 0., 5., 5.]])
要添加各種問題的答案,就可以拿到角球項目的視圖(不是副本)做:
corners = a[::a.shape[0]-1, ::a.shape[1]-1]
或者,對於一般的n維數組:
corners = a[tuple(slice(None, None, j-1) for j in a.shape)]
這樣做,則可以通過修改視圖修改原始數組:
>>> a = np.arange(9).reshape(3, 3)
>>> a
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
>>> corners = a[tuple(slice(None, None, j-1) for j in a.shape)]
>>> corners
array([[0, 2],
[6, 8]])
>>> corners += 1
>>> a
array([[1, 1, 3],
[3, 4, 5],
[7, 7, 9]])
EDIT啊,你想要一個角落價值的平面列表......這通常不能用視圖來實現,所以@ IanH的回答就是你要找的。
你可以手動指定角(使用負索引):
a = numpy.array([[ 1., 0., 0., 0.],
[ 0., 1., 0., 0.],
[ 0., 0., 1., 5.],
[ 0., 0., 5., 5.]])
result = numpy.array([a[0][0],a[0][-1],a[-1][0],a[-1][-1]])
# result will contain array([ 1., 0., 0., 5.])
result = numpy.array([a[0][0],a[0][-1],a[-1][0],a[-1][-1]])
# result will contain array([[ 1., 0.],
# [ 0., 5.]])
如何
A[[0,0,-1,-1],[0,-1,0,-1]]
其中A
是數組。
使用np.ix_來構建指數。
>>> a
array([[1., 0., 0., 0.],
[0., 1., 0., 0.],
[0., 0., 1., 5.],
[0., 0., 5., 5.]])
>>> corners = np.ix_((0,-1),(0,-1))
>>> a[corners]
array([[1., 0.],
[0., 5.]])
這絕對是比較籠統的,儘管我對花式索引的回答確實支持賦值,但並不像視圖那麼靈活。另外,如果你想要一個扁平版本,你可以只做'corners.ravel()'。 – IanH
@IanH但是'.ravel()'會觸發大多數數組的副本,因爲它需要非常量步長。 – Jaime
好點,我錯過了。你是對的,那只是問題的一個固有限制。 – IanH