如果我有每个维度中给定矩阵的起始和结束索引列表,有没有办法以有效的方式进行切片? 例如:
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]
任何帮助都值得赞赏。
答案 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)个数组并将它们合并为一个。有可能加入索引,并进行一次索引,但这需要一些摆弄,并且可能无法提高速度。
在担心有效地做事之前,让我们清楚一下你想做什么。我猜你需要以i
和j
的值以某种方式迭代,并连接值。无论是连接还是索引或索引然后连接都没关系。
如果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]]])