1、numpy.reshape
numpy.reshape(a, newshape, order='C')
在不更改其数据的情况下为数组赋予新形状。
-
a:
数组——需要处理的数据
-
newshape :
新的格式——整数或整数数组,如 (2,3) 表示2行3列。新的形状应该与原来的形状兼容,即行数和列数相乘后等于a中元素的数量。如果是整数,则结果将是长度的一维数组,所以这个整数必须等于a中元素数量。若这里是一个整数数组,那么其中一个数据可以为-1。在这种情况下,这个个值python会自动从根据第二个数值和剩余维度推断出来
-
order:
可选范围为{‘C’, ‘F’, ‘A’}。使用索引顺序读取a的元素,并按照索引顺序将元素放到变换后的的数组中。如果不进行order参数的设置,默认参数为C
- “C”:指的是用类C写的读/索引顺序的元素,最后一个维度变化最快,第一个维度变化最慢。以二维数组为例,简单来讲就是横着读,横着写,优先读/写一行;
- “F”:是指用FORTRAN类索引顺序读/写元素,最后一个维度变化最慢,第一个维度变化最快。竖着读,竖着写,优先读/写一列。注意,“C”和“F”选项不考虑底层数组的内存布局,只引用索引的顺序;
- “A”:选项所生成的数组的效果与原数组a的数据存储方式有关,如果数据是按照FORTRAN存储的话,它的生成效果与”F“相同,否则与“C”相同
2、torch.nn.Unfold:滑动裁剪
从批处理输入张量中提取滑动局部块。
torch.nn.Unfold(kernel_size, dilation=1, padding=0, stride=1)
- kernel_size:滑动窗口的size
- stride:空间维度上滑动的步长,Default: 1
- padding:在输入的两侧添加的隐式零填充. Default: 0
- dilation:空洞卷积的扩充率,Default: 1
torch.nn.Unfold
按照官方的说法,既从一个batch的样本中,提取出滑动的局部区域块,也就是卷积操作中的提取kernel filter对应的滑动窗口。
- 由上可知,
torch.nn.Unfold
的参数跟nn.Conv2d
的参数很相似,即,kernel_size(卷积核的尺寸),dilation(空洞大小),padding(填充大小)和stride(步长) - 官方解释中:
unfold
的输入为 ( N , C , H , W ) (N,C,H,W) (N,C,H,W),其中 N N N为batch_size, C C C是channel个数, H H H和 W W W分别是channel的长宽。
unfold
输出为 ( N , C × ∏ ( kernel_size ) , L ) \left(N, C \times \prod(\text { kernel\_size }), L\right) (N,C×∏( kernel_size ),L),其中 ∏ ( kernel_size ) \prod(\text { kernel\_size }) ∏( kernel_size )为 k e r n e l _ s i z e kernel\_size kernel_size长宽的乘积。 L L L是 ( H , W ) (H,W) (H,W)根据 k e r n e l _ s i z e kernel\_size kernel_size尺寸滑动裁剪后,得到的区块的数量。
-
Input: ( N , C , ∗ ) (N,C,*) (N,C,∗)
-
Output: ( N , C × ∏ ( kernel_size ) , L ) \left(N, C \times \prod(\text { kernel\_size }), L\right) (N,C×∏( kernel_size ),L)
L = ∏ d ∈ ( 0 , 1 ) ⌊ feature_size [ d ] + 2 padding [ d ] − dilation [ d ] ⋅ ( kernel_size [ d ] − 1 ) − 1 stride [ d ] + 1 ⌋ . L=\prod_{d \in(0,1)}\left\lfloor \frac{\text { feature\_size }[\mathrm{d}]+2 \text { padding }[\mathrm{d}]-\text { dilation }[\mathrm{d}] \cdot(\text { kernel\_size }[\mathrm{d}]-1)-1}{\text { stride}[\mathrm{d}]}+1\right\rfloor. L=d∈(0,1)∏⌊ stride[d] feature_size [d]+2 padding [d]− dilation [d]⋅( kernel_size [d]−1)−1+1⌋.
inputs = torch.randint(0,9,(1, 2, 4, 4))
'''
tensor([[[[4, 7, 1, 4],
[4, 2, 8, 1],
[3, 6, 0, 8],
[0, 7, 6, 3]],
[[4, 8, 4, 6],
[6, 6, 6, 3],
[7, 7, 5, 0],
[2, 1, 7, 7]]]])
'''
unfold = torch.nn.Unfold(kernel_size=(2, 2), stride=2)
patches = unfold(inputs.float())
'''
tensor([[[4., 1., 3., 0.],
[7., 4., 6., 8.],
[4., 8., 0., 6.],
[2., 1., 7., 3.],
[4., 4., 7., 5.],
[8., 6., 7., 0.],
[6., 6., 2., 7.],
[6., 3., 1., 7.]]])
'''
3、灰度图和彩图的区别
3.1、属性上的区别
先看一张灰度图的属性:
灰度图的位深度为8。
再看彩图的属性:
彩图的位深度为24。
3.2、读取后存储的区别
from skimage import io
分别读取这两张图像:
gray = io.imread("test/lena.BMP")
color = io.imread("test/lena.png")
查看变量属性:
4、np.unravel_index:获取索引
获取一个/组int
类型的索引值在一个多维数组中的位置。
A = np.random.randint(0,10,size=(2,3))
'''
array([[1, 3, 8],
[0, 4, 2]])
'''
ind_max = np.argmax(A) #2
此时得到的索引是将A数组flattern(展成一维数组)后的索引:
A.flatten()
'''
[1 3 8 0 4 2]
'''
可以看到索引确实是2。
那如何得到对应的原数组的索引呢?
ind_max_src = np.unravel_index(ind_max, A.shape) #(0, 2)