Python中的list,array

来源:互联网 发布:算法培训班 编辑:程序博客网 时间:2024/06/06 20:37

在python中,list是其内置数据类型,而array是numpy中的一个数据类型。
两者的区别在于:
(1)list中的数据类不必相同的,而array的中的类型必须全部相同
(2) 在list中的数据类型保存的是数据的存放的地址,即通过链表实现的。而array是通过线性表实现的。
numpy中封装的array有很强大的功能。
下面来具体看一下。

a=[[[1,2,3],[4,5,6],[7,8,9]],[[-1,2,3],[4,5,6],[7,8,9]],[[1,-2,3],[4,5,6],[7,8,9]]]print a 

得到的输出是:
[[[1, 2, 3], [4, 5, 6], [7, 8, 9]], [[-1, 2, 3], [4, 5, 6], [7, 8, 9]], [[1, -2, 3], [4, 5, 6], [7, 8, 9]]]
我们将上述的List a转化成array,这里调用了numpy库

in_=np.array(a)print in_

得到的输出是:
[[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]]

[[-1 2 3]
[ 4 5 6]
[ 7 8 9]]

[[ 1 -2 3]
[ 4 5 6]
[ 7 8 9]]]
可见,list的输出是一条横排,而且中间有逗号。array的输出是组织好的,而且没有逗号,这个可以帮助我们区分一个数据是list还是array。
可以通过tolist方法将array转化为list。

b=in_.tolist()

下面对通过对array实现对图像的读取操作。

from PIL import Imageimport numpy as npa=Image.open('G:\\000001.jpg') #这张图片h=4,w=6,c=3im=np.array(a)  #将其转化为array,才能进行后续的操作print imprint im.shape

输出为
[[[137 132 138]
[104 99 103]
[150 144 144]
[154 149 145]
[251 244 236]
[217 211 199]]

[[135 130 136]
[ 4 0 3]
[ 4 0 0]
[ 6 1 0]
[ 7 0 0]
[149 143 131]]

[[138 133 137]
[ 5 0 4]
[ 9 3 3]
[ 8 3 0]
[ 6 0 0]
[149 143 131]]

[[245 240 244]
[255 254 255]
[186 180 180]
[186 181 177]
[102 95 87]
[203 197 185]]]
(4L, 6L, 3L)
所以python自带的PIL库读出来的图像是H*W*C的,且为RGB格式的。三维数组的第一个维度是H,第二个维度是W,第三个维度是C。
现在我们想将其变为BGR格式的,那么就需要在第三个维度上进行翻转。方法是:

im1=im[:,:,::-1] #表示第一个和第二个维度不变,第三个维度翻转print im1

输出为:
[[[138 132 137]
[103 99 104]
[144 144 150]
[145 149 154]
[236 244 251]
[199 211 217]]

[[136 130 135]
[ 3 0 4]
[ 0 0 4]
[ 0 1 6]
[ 0 0 7]
[131 143 149]]

[[137 133 138]
[ 4 0 5]
[ 3 3 9]
[ 0 3 8]
[ 0 0 6]
[131 143 149]]

[[244 240 245]
[255 254 255]
[180 180 186]
[177 181 186]
[ 87 95 102]
[185 197 203]]]
如果想在第一个维度或者第二个维度上实现这种翻转,那么相应的代码就是
im1=im[::-1]
im1=im[:,::-1,:]
有时,如果我们想将图像减去均值。则可以将其实现如下:

b=np.array((-100,100,0))print b k=im1-bprint k

则输出如下:
[-100 100 0]
[[[ 238 32 137]
[ 203 -1 104]
[ 244 44 150]
[ 245 49 154]
[ 336 144 251]
[ 299 111 217]]

[[ 236 30 135]
[ 103 -100 4]
[ 100 -100 4]
[ 100 -99 6]
[ 100 -100 7]
[ 231 43 149]]

[[ 237 33 138]
[ 104 -100 5]
[ 103 -97 9]
[ 100 -97 8]
[ 100 -100 6]
[ 231 43 149]]

[[ 344 140 245]
[ 355 154 255]
[ 280 80 186]
[ 277 81 186]
[ 187 -5 102]
[ 285 97 203]]]
可见,B通道都被减去了-100,G通道都被减去了100,R通道都被减去了0。
最后我们想把图像从H*W*C转换成C*H*W的,则需要对其进行转置,方法如下:

k = k.transpose((2,0,1))

输出如下:
[[[ 238 203 244 245 336 299]
[ 236 103 100 100 100 231]
[ 237 104 103 100 100 231]
[ 344 355 280 277 187 285]]

[[ 32 -1 44 49 144 111]
[ 30 -100 -100 -99 -100 43]
[ 33 -100 -97 -97 -100 43]
[ 140 154 80 81 -5 97]]

[[ 137 104 150 154 251 217]
[ 135 4 4 6 7 149]
[ 138 5 9 8 6 149]
[ 245 255 186 186 102 203]]]
此时,图像的维度为3*4*6(C*H*W)。

0 0
原创粉丝点击