使用索引列表在python中切割矩阵

时间:2015-04-09 00:16:58

标签: python numpy matrix slice

如果我有每个维度中给定矩阵的起始和结束索引列表,有没有办法以有效的方式进行切片? 例如:

   a=10
   b=10
   x_0=np.zeros((5,a,b))
   i=[0, 5, 3, 5, 3]
   j=[2, 4, 0, 6, 6]
   x_1=x_0[:,i:i+3,j:j+3]  

这里x_1 [k]将是(5,3,3)。换句话说:

X_1[0,3,3]=x0[0,i[0]:i[0]+3,j[0]:j[0]+3]
X_1[1,3,3]=x0[1,i[1]:i[1]+3,j[1]:j[1]+3]
X_1[2,3,3]=x0[2,i[2]:i[2]+3,j[2]:j[2]+3]
X_1[3,3,3]=x0[3,i[3]:i[3]+3,j[3]:j[3]+3]
X_1[4,3,3]=x0[4,i[4]:i[4]+3,j[4]:j[4]+3]

或更具体地说:

for k in range(5):
   x_1[k]=x_0[k,i[k]:i[k]+3,j[k]:j[k]+3]

任何帮助都值得赞赏。

1 个答案:

答案 0 :(得分:1)

i = 0
j = 2
x_0[:,i:i+3,j:j+3]

生成(5,3,3)数组。

但是你想做什么?

i=[0, 5, 3, 5, 3]
j=[2, 4, 0, 6, 6]

例如,您是否希望为(5,3,3)i的每对值生成j数组?

或者你想堆叠?

x_0[0,0:3,2:5]
x_0[1,5:8,4:7]
...

可以用:

生成
np.array([x0[kk,ii:ii+3,jj:jj+3] for kk,(ii,jj) in enumerate(zip(i,j))])

这里我收集5(3,3)个数组并将它们合并为一个。有可能加入索引,并进行一次索引,但这需要一些摆弄,并且可能无法提高速度。

在担心有效地做事之前,让我们清楚一下你想做什么。我猜你需要以ij的值以某种方式迭代,并连接值。无论是连接还是索引或索引然后连接都没关系。


如果x0=np.arange(500).reshape(5,10,10),则上述表达式产生:

array([[[  2,   3,   4],
        [ 12,  13,  14],
        [ 22,  23,  24]],

       [[154, 155, 156],
        [164, 165, 166],
        [174, 175, 176]],

       [[230, 231, 232],
        [240, 241, 242],
        [250, 251, 252]],

       [[356, 357, 358],
        [366, 367, 368],
        [376, 377, 378]],

       [[436, 437, 438],
        [446, 447, 448],
        [456, 457, 458]]])