【问题标题】:Slice a matrix in python using list of indices使用索引列表在python中对矩阵进行切片
【发布时间】:2015-06-14 04:08:58
【问题描述】:

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

   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]

任何帮助都将不胜感激。

【问题讨论】:

  • x_1 = x_0[:,i[:3],:][:,:,j[:3]]怎么样
  • 您希望如何分割0s 的数组并以(5,3,3) 结尾?

标签: python numpy matrix slice


【解决方案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]

例如,您想为ij 中的每对值生成一个(5,3,3) 数组吗?

还是要堆叠?

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

【讨论】:

  • 感谢您的 cmets。是的,我想创建五个 (3,3) 数组。我会相应地更新问题。无论如何,让我们考虑这个例子,你有几个大图像(回到上面的例子,5个图像),你想从每个窗口中选择一个具有给定开始和结束索引的子窗口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
  • 2013-03-18
  • 2017-01-22
  • 1970-01-01
  • 2017-06-22
  • 2020-02-27
  • 2012-09-15
相关资源
最近更新 更多