Python Numpy 2d array slicing minus index to plus index

ws51t4hk  于 2023-04-21  发布在  Python
关注(0)|答案(3)|浏览(132)

我想对数组进行切片,以便最后一个值后面跟着第一个值。
验证码:

import numpy as np

arr = [[1, 2, 3, 4], 
       [5, 6, 7, 8], 
       [9, 10, 11, 12], 
       [13, 14, 15, 16]]

m = np.array(arr)

print(m[-1:1, -1:1])

预期输出:

[[16 13]
 [4 1]]

实际输出:

[]
sxpgvts3

sxpgvts31#

您必须使用高级索引:

In [64]: arr=np.arange(1,17).reshape(4,4)   
In [65]: arr[[[3],[0]],[3,0]]       # or -1 as in mozway's answer
Out[65]: 
array([[16, 13],
       [ 4,  1]])

进一步考虑后,您可以使用-3步骤:

In [67]: arr[-1::-3, -1::-3]
Out[67]: 
array([[16, 13],
       [ 4,  1]])

数字和形状是相同的,但strides不同(一个是副本,另一个是视图(有一些有趣的步幅):

In [69]: arr[[[-1],[0]],[-1,0]].strides
Out[69]: (8, 4)
In [70]: arr[-1::-3, -1::-3].strides
Out[70]: (-48, -12)
31moq8wy

31moq8wy2#

您正在尝试创建网格。不要使用切片。
您可以使用ix_作为便利:

m[np.ix_([-1, 1], [-1, 1])]

输出:

array([[16, 14],
       [ 8,  6]])

或者,如果你想要第一个索引,使用0(而不是1):

m[np.ix_([-1, 0], [-1, 0])]

输出:

array([[16, 13],
       [ 4,  1]])
xwmevbvl

xwmevbvl3#

您可以使用此问题:

import numpy as np

arr = [[1, 2, 3, 4], 
       [5, 6, 7, 8], 
       [9, 10, 11, 12], 
       [13, 14, 15, 16]]

m = np.array(arr)

print(m[0:len(m):len(m)-1, 0:len(m):len(m)-1][::-1, ::-1])

可能不是最好的,但它的工作。

相关问题