2013-07-30 122 views
3

我试图访问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.]]) 

回答

4

要添加各种问题的答案,就可以拿到角球项目的视图(不是副本)做:

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的回答就是你要找的。

+0

这绝对是比较笼统的,尽管我对花式索引的回答确实支持赋值,但并不像视图那么灵活。另外,如果你想要一个扁平版本,你可以只做'corners.ravel()'。 – IanH

+0

@IanH但是'.ravel()'会触发大多数数组的副本,因为它需要非常量步长。 – Jaime

+0

好点,我错过了。你是对的,那只是问题的一个固有限制。 – IanH

0

你可以手动指定角(使用负索引):

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.]]) 
3

如何

A[[0,0,-1,-1],[0,-1,0,-1]] 

其中A是数组。

0

使用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.]])