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)
此时得到的索引是将A数组flattern(展成一维数组)后的索引:
A.flatten()
'''
[1 3 8 0 4 2]
'''
可以看到索引确实是2。
那如何得到对应的原数组的索引呢?
ind_max_src = np.unravel_index(ind_max, A.shape)
|