Python中的list,array

在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 Image
import numpy as np
a=Image.open('G:\\000001.jpg') #这张图片h=4,w=6,c=3
im=np.array(a)  #将其转化为array,才能进行后续的操作
print im
print 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-b
print 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pythonlistarray是两种不同的数据类型。listPython的内置数据类型,而array是numpy库定义的数据类型。在使用array之前,需要先下载和安装numpy库\[2\]。 listarray在一些方面有相同之处,比如它们都可以通过索引来进行操作\[1\]。例如,可以使用lis1\[0\]和a\[0\]来获取listarray的第一个元素。 然而,listarray也有一些不同之处。首先,list的数据类型可以不相同,而array的数据类型必须全部相同\[2\]。其次,list保存的是数据的存放地址,而不是数据本身,这意味着list需要额外的存储空间和CPU消耗\[2\]。 此外,listarray在进行加法运算时也有不同。对于list来说,加法运算是列表长度的增删,与数学计算无关\[1\]。而对于array来说,加法运算是真正的数学四则运算\[1\]。 对于list,可以使用append()方法来在末尾添加元素,使用insert()方法在指定位置插入元素,使用remove()方法删除指定元素,使用pop()方法删除指定索引的元素,使用del关键字删除最后一个元素\[3\]。 总结来说,listPython的内置数据类型,可以保存不同类型的数据,而array是numpy库定义的数据类型,要求所有元素的类型相同。在使用上,listarray在索引操作和加法运算上有相似之处,但在内存占用和数据类型要求上有不同。 #### 引用[.reference_title] - *1* *2* [PythonlistArray](https://blog.csdn.net/weixin_52030368/article/details/128593124)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [python数组array和列表list的基本用法介绍](https://blog.csdn.net/weixin_45707610/article/details/131140384)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值