Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在4d阵列上查看\u作为\u窗口_Python_Numpy_Scikit Image - Fatal编程技术网

Python 在4d阵列上查看\u作为\u窗口

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

给定一系列形状(批次大小,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.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]]]