Python 在4d阵列上查看\u作为\u窗口
给定一系列形状(批次大小,w,h,c)和面片大小(p,p),我想从每个3D矩阵(即形状(p,p,c))中提取面片。面片不会重叠,因此步幅可以认为是p 这将返回一个数组(批大小*p*p,p,p,c) 这里使用的是一个最小的示例Python 在4d阵列上查看\u作为\u窗口,python,numpy,scikit-image,Python,Numpy,Scikit Image,给定一系列形状(批次大小,w,h,c)和面片大小(p,p),我想从每个3D矩阵(即形状(p,p,c))中提取面片。面片不会重叠,因此步幅可以认为是p 这将返回一个数组(批大小*p*p,p,p,c) 这里使用的是一个最小的示例 import numpy as np import skimage a = np.arange(8*8*2).reshape((8, 8, 2)) b = a * 2 c = np.concatenate((a[np.newaxis, :, :, :], b[np.new
import numpy as np
import skimage
a = np.arange(8*8*2).reshape((8, 8, 2))
b = a * 2
c = np.concatenate((a[np.newaxis, :, :, :], b[np.newaxis, :, :, :]), axis = 0)
d = skimage.util.view_as_windows(c, 2, step = 2).reshape((8*2*2, 2, 2, 2))
但是,只有备选值是我所期望的:
d[0]
Out[183]:
array([[[ 0, 1],
[ 2, 3]],
[[16, 17],
[18, 19]]])
d[1]
Out[184]:
array([[[ 0, 2],
[ 4, 6]],
[[32, 34],
[36, 38]]])
d[2]
Out[185]:
array([[[ 4, 5],
[ 6, 7]],
[[20, 21],
[22, 23]]])
d[3]
Out[186]:
array([[[ 8, 10],
[12, 14]],
[[40, 42],
[44, 46]]])
d[4]
Out[187]:
array([[[ 8, 9],
[10, 11]],
[[24, 25],
[26, 27]]])
因此,d[::2]
接近我的解决方案,但一半的值丢失了
我不确定问题是否出在窗口大小或步骤上,或者即使我的问题可能是使用
view\u as\u windows
,因此我愿意接受任何有效的建议。首先,我想你的意思是返回一卷形状(批量大小*w/p*h/p,p,p,c)
?即,如果补片不重叠,则补片前后尺寸的乘积应相同
在解决了这个问题之后,我做了以下尝试。我正在改变批量大小和通道尺寸,以便更清楚地显示哪个是哪个
import numpy as np
from skimage import util
batch = np.arange(4*8*8*3).reshape((4, 8, 8, 3))
blocked = util.view_as_blocks((1, 2, 2, 3))
patches = blocked.reshape((64, 2, 2, 3))
print(patches[0].transpose((2, 0, 1)))
print(patches[1].transpose((2, 0, 1)))
其中:
[[[0 1]
[8 9]]
[[0 1]
[8 9]]
[[0 1]
[8 9]]]
及
不幸的是,重塑会触发复制。我不确定是否有办法避免它,但希望这不是您主要的计算/内存问题
[[[ 2 3]
[10 11]]
[[ 2 3]
[10 11]]
[[ 2 3]
[10 11]]]