我正在尝试访问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]])
编辑啊,你想要一个角落值的平面列表......通常不能用视图实现,所以@ IanH的答案就是你要找的。
怎么样
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.]])
您可以手动指定角点(使用负索引):
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.]])