今天我需要在大矩阵中提取小矩阵,百度了一波之后,我以为他与matlab中一样,可以用i+:,但是我用了之后才发现他只支持了一半,把我坑到了、

例子

一个简单的程序,从[200,200]的矩阵中取出[20,20]的小矩阵.

x = np.arange(400*100).reshape(200, 200)
print(x.shape)

for j in range(10):
for i in range(10):
print(x[j*20+0:20, i*20+0:20].shape)

观察输出,发现只有第一次取的矩阵是正确的:

(200, 200)
(20, 20)
(20, 0)
(20, 0)
(20, 0)
(20, 0)
(20, 0)
(20, 0)
(20, 0)
(20, 0)
(20, 0)
(0, 20)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 20)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 20)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 20)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 20)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 20)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 20)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 20)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 20)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)
(0, 0)

错误解析

看这里

x[j*20+0:20, i*20+0:20]

其中

j*20+0:20

这里其实是python不支持matlab中先那样,从0:20中创建序列然后再对序列每一个元素做加法.

而在python中是把他自动解析成两部分的:(j*20+0):(20),所以循环下去就会出现问题

修改如下

按照python中的规则即可~~

(就是写起来好不爽

x = np.arange(400*100).reshape(200, 200)
print(x.shape)

for j in range(10):
for i in range(10):
print(x[j*20+0:j*20+20, i*20+0:i*20+20].shape)