python中的list和array的不同之处

python中的list是python的内置数据类型,list中的数据类不必相同的,而array的中的类型必须全部相同。在list中的数据类型保存的是数据的存放的地址,简单的说就是指针,并非数据,这样保存一个list就太麻烦了,例如list1=[1,2,3,'a']需要4个指针和四个数据,增加了存储和消耗cpu。

numpy中封装的array有很强大的功能,里面存放的都是相同的数据类型

  1. list1=[1,2,3,'a']
  2. print list1
  3. a=np.array([1,2,3,4,5])
  4. b=np.array([[1,2,3],[4,5,6]])
  5. c=list(a) # array到list的转换
  6. print a,np.shape(a)
  7. print b,np.shape(b)
  8. print c,np.shape(c)

运行结果:

  1. [1, 2, 3, 'a'] # 元素数据类型不同,并且用逗号隔开
  2. [1 2 3 4 5] (5L,) # 一维数组,类型用tuple表示
  3. [[1 2 3]
  4. [4 5 6]] (2L, 3L)
  5. [1, 2, 3, 4, 5] (5L,)

创建:

array的创建:参数既可以是list,也可以是元组.使用对应的属性shape直接得到形状
  1. a=np.array((1,2,3,4,5))# 参数是元组
  2. b=np.array([6,7,8,9,0])# 参数是list
  3. c=np.array([[1,2,3],[4,5,6]])# 参数二维数组
  4. print a,b,
  5. c.shape()

也可以直接改变属性array的形状,-1代表的是自己推算。这里并不是T, reshape(())也可以

  1. c = np.array([[1, 2, 3, 4],[4, 5, 6, 7], [7, 8, 9, 10]])
  2. c.shape # (3L, 4L)
  3. c.shape=4,-1 //c.reshape((2,-1))
  4. c
  1. <pre style="box-sizing: border-box; overflow: auto; font-size: 14px; padding: 0px; margin-top: 0px; margin-bottom: 0px; line-height: 17.0001px; word-break: break-all; word-wrap: break-word; border: 0px; border-radius: 0px; white-space: pre-wrap; vertical-align: baseline; background-color: rgb(255, 255, 255);">array([[ 1, 2, 3],
  2. [ 4, 4, 5],
  3. [ 6, 7, 7],
  4. [ 8, 9, 10]])
   
   这里的reshape最终相当于是一个浅拷贝,也就是说还是和原来的书c使用相同的内存空间
  1. d=c.reshape((2,-1))
  2. d[1:2]=100
  3. c
array([[  1,   2,   3],[  4,   4,   5],[100, 100, 100],[100, 100, 100]])
   前面在创建数组的时候并没有使用数据类型,这里我们也可以使用数据类型。默认的是int32.
  1. a1=np.array([[1,2,3],[4,5,6]],dtype=np.float64)
  2. print a1.dtype,a.dtype #float64 int32<pre style="margin-top: 0px; margin-bottom: 0px; line-height: 17.0001px; box-sizing: border-box; overflow: auto; font-size: 14px; padding: 0px; word-break: break-all; word-wrap: break-word; border: 0px; border-radius: 0px; white-space: pre-wrap; vertical-align: baseline; background-color: rgb(255, 255, 255);">

前面在创建的时候我们都是使用的np.array()方法从tuple或者list转换成为array,感觉很是费劲,numpy自己提供了很多的方法让我们自己直接创建一个array.

 
  1. arr1=np.arange(1,10,1) #
  2. arr2=np.linspace(1,10,10)
  3. print arr1,arr1.dtype
  4. print arr2,arr2.dtype
[1 2 3 4 5 6 7 8 9] int32
[  1.   2.   3.   4.   5.   6.   7.   8.   9.  10.] float64

np.arange(a,b,c)表示产生从a-b不包括b,间隔为c的一个array,数据类型默认是int32。但是linspace(a,b,c)表示的是把a-b平均分成c分,它包括b。

   有时候我们需要对于每一个元素的坐标进行赋予不同的数值,可以使用fromfunction函数

  1. def fun(i):
  2. return i%4+2
  3. np.fromfunction(fun,(10,))
array([ 2.,  3.,  4.,  5.,  2.,  3.,  4.,  5.,  2.,  3.])
   fromfunction必须支持多维数组,所以他的第二个参数必须是一个tuple,只能是(10,),(10)是错误的。

  1. def fun2(i,j):
  2. return (i+1)*(j+1)
  3. np.fromfunction(fun2,(9,9))
array([[  1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.],[  2.,   4.,   6.,   8.,  10.,  12.,  14.,  16.,  18.],[  3.,   6.,   9.,  12.,  15.,  18.,  21.,  24.,  27.],[  4.,   8.,  12.,  16.,  20.,  24.,  28.,  32.,  36.],[  5.,  10.,  15.,  20.,  25.,  30.,  35.,  40.,  45.],[  6.,  12.,  18.,  24.,  30.,  36.,  42.,  48.,  54.],[  7.,  14.,  21.,  28.,  35.,  42.,  49.,  56.,  63.],[  8.,  16.,  24.,  32.,  40.,  48.,  56.,  64.,  72.],[  9.,  18.,  27.,  36.,  45.,  54.,  63.,  72.,  81.]])
    虽然说,这里提供了很多的直接产生array的方式,但是大部分情况我们都是会从list进行转换,因为在实际的处理中,我们需要从txt加载文件,那样直接读入的数据显示存放到list中,需要处理的时候我们转换到array,因为
array的设计更加符合我们的使用,涉及到矩阵的运算在使用mat,那么list主要就是用进行元素的索取。

  1. def loaddataSet(fileName):
  2. file=open(fileName)
  3. dataMat=[] //
  4. for line in file.readlines():
  5. curLine=line.strip().split('\t')
  6. floatLine=map(float,curLine)//这里使用的是map函数直接把数据转化成为float类型
  7. dataMat.append(floatLine)
  8. return dataMat

上面的韩顺返回最终的数据就是最初的list数据集,再根据不同的处理需求是转化到array还是mat。其实array是mat的父类,能用mat的地方,array理论上都能传入。



元素访问:

  1. arr[5] #5
  2. arr[3:5] #array([3, 4])
  3. arr[:5] #array([0, 1, 2, 3, 4])
  4. arr[:-1]# array([0, 1, 2, 3, 4, 5, 6, 7, 8])
  5. arr[:] #array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
  6. arr[2:4]=100 # array([ 0, 1, 100, 100, 4, 5, 6, 7, 8, 9])
  7. arr[1:-1:2] #array([ 1, 100, 5, 7]) 2 是间隔
  8. arr[::-1] #array([ 9, 8, 7, 6, 5, 4, 100, 100, 1, 0])
  9. arr[5:2:-1]# -1的间隔表示从右向左所以5>2 #array([ 5, 4, 100])
   上面是array的一维数组的访问方式,我们再来看看二维的处理方式
  1. print c[1:2]# c[1:2].shape-->(1L, 3L)
  2. print c[1:2][0] # shape-->(3L,)
[[4 4 5]]
[4 4 5]
  1. print c[1]
  2. print c[1:2]
[4 4 5]
[[4 4 5]]
  1. print c[1][2]
  2. print c[1:4]
  3. print c[1:4][0][2]
5
[[  4   4   5][100 100 100][100 100 100]]
5
   可以看出对于有:的表达最终的结果外面还嵌套一层list的[],。访问的一定要注意,python最bug的就是,语法
灵活,不管怎样写索引语法都是正确的,但是最终的书结果却让你大跌眼镜。

    还有array的索引最终产生的是一个一个原始数据的浅拷贝,还和原来的数据共用一块儿内存

  1. b=arr[1:6]
  2. b[:3]=0
  3. arr #<pre style="box-sizing: border-box; overflow: auto; font-size: 14px; padding: 0px; margin-top: 0px; margin-bottom: 0px; line-height: 17.0001px; word-break: break-all; word-wrap: break-word; border: 0px; border-radius: 0px; white-space: pre-wrap; vertical-align: baseline; background-color: rgb(255, 255, 255);">array([0, 0, 0, 0, 4, 5, 6, 7, 8, 9])
    
    产生上面的原因是因为array中直接存放的数据,拷贝的话直接拿走的是pointer,没有取走数据,但是list却会直接发生深拷贝,数据指针全部带走
  1. list1=list(c)
  2. list1[1]=0
  3. list1 #上面修改的0并没有被改变
[array([1, 2, 3]), 0, array([100, 100, 100]), array([100, 100, 100])]
   除了这些之外还有自己的更加牛掰的方式(只能用array)
   1)使用布尔数组.感觉甚是强大,就不要自己写什么判断语句啦,注意这种方式得到结果不和原始数组共享空间。布尔索引仅仅适用于数组array,list没资格用。布尔索引最终得到下标索引为true的数据。索引只能是布尔数组
  1. a=np.array(a*2)
  2. a>5
  3. a[a>5] #
array([16, 32, 48, 64, 80, 16, 32, 48, 64, 80])
   
   2)列表索引

      列表索引可以是数组和list。返回的数据不和原来的数据共享内存。索引可以是list和array
  1. x=np.arange(10)
  2. index=[1,2,3,4,5]
  3. arr_index=np.array(index)
  4. print x
  5. print x[index] # list索引
  6. print x[arr_index] # array索引
[0 1 2 3 4 5 6 7 8 9]
[1 2 3 4 5]
[1 2 3 4 5]
  array和list区别*2
  1. a=np.arange(10)
  2. lista=list(a)
  3. print a*2
  4. print lista*2
[ 0  2  4  6  8 10 12 14 16 18]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

array的广播

  1. a = np.arange(0, 60, 10).reshape(-1, 1)
  2. b = np.arange(0, 5)
  3. print a
  4. print b
[[ 0][10][20][30][40][50]]
[0 1 2 3 4]
print np.add(a,b,c)
[[ 0  1  2  3  4][10 11 12 13 14][20 21 22 23 24][30 31 32 33 34][40 41 42 43 44][50 51 52 53 54]]

转自博客:https://blog.csdn.net/liyaohhh/article/details/51055147#reply

python中的list和array的不同之处相关推荐

  1. python中的list和array的区别及相互转化

    电脑环境 电脑环境:Windows 10 教育版 Python:python3.6 概述 python中的list是python的内置数据类型,list中的数据类不必相同的,而array的中的类型必须 ...

  2. python中数组(numpy.array)的基本操作【转载】

    为什么要用numpy Python中提供了list容器,可以当作数组使用.但列表中的元素可以是任何对象,因此列表中保存的是对象的指针,这样一来,为了保存一个简单的列表[1,2,3].就需要三个指针和三 ...

  3. python中找出numpy array数组的最值及其索引

    在list列表中,max(list)可以得到list的最大值,list.index(max(list))可以得到最大值对应的索引 但在numpy中的array没有index方法,取而代之的是where ...

  4. python 怎么打印数组_?怎么将python中的数组全部打印出来array

    python array list 1,3似乎不遍历循环是不行滴~ python中的list和array的不同之处 上面正解 python的numpy中合并array 你好: 你用append()是函 ...

  5. python中数组转矩阵_python实现矩阵和array数组之间的转换

    python 列表.矩阵.数组之间的关系 矩阵可以实现多维切片,如: b = m[1:10, 3:20] 但是 多维列表却不可以首先,没见过b = m[1:10, 3:20] 这种写法,小编试了一下有 ...

  6. Python中的np.array理解

    问题引入 import numpy as np action = [] print(action.append(1)) print(np.array(action)) 结果为: None [1] 为什 ...

  7. Python 中各种imread函数的区别与联系

    Python 中各种imread函数的区别与联系 最近一直在用python做图像处理相关的东西,被各种imread函数搞得很头疼,因此今天决定将这些imread总结一下,以免以后因此犯些愚蠢的错误.如 ...

  8. [转载] 莫烦python学习笔记之numpy.array,dtype,empty,zeros,ones,arrange,linspace

    参考链接: Python中的numpy.empty array:创建数组dtype:指定数据类型empty:创建数据接近0zeros:创建数据全为0ones:创建数据全为1arrange:按指定范围创 ...

  9. python中imread什么意思_Python 中各种imread函数的区别与联系

    Python 中各种imread函数的区别与联系 最近一直在用python做图像处理相关的东西,被各种imread函数搞得很头疼,因此今天决定将这些imread总结一下,以免以后因此犯些愚蠢的错误.如 ...

最新文章

  1. QButtonGroup 的使用
  2. Powershell管理系列(五)修改AD账号属性
  3. python输出特别的矩阵
  4. 用express-generator创建express项目骨架
  5. 3、循序渐进设计模式-创建型
  6. [原创] Matlab 指派问题模型代码
  7. PAT L2-005 集合相似度
  8. F4 value help and HANA native SQL
  9. android 拨打多个电话,Android的第一个应用(拨打电话)
  10. 手把手教你启动若依单体项目
  11. AI智能电话机器人源码搭建的原理
  12. python pip 下载
  13. 51,AVR,PIC,MSP430,STM32单片机比较
  14. php 快递打印设置,京麦工作台打印机设置 快递单连打设置
  15. 银行数字化转型导师坚鹏:苏州银行数字化运营之认知篇培训结束
  16. Python烤地瓜案例
  17. volatile busy wating
  18. 【cocos2d-x从c++到js】22:使用非侵入方式扩展UI系统接口的举例
  19. PHP应用-一揽子解决方案
  20. Python123 期末题库

热门文章

  1. 记录kettle spoon.bat 无法启动 (系统找不到指定的路径。) 只有无限接近死亡 才能领悟真滴
  2. 苹果手机的隐藏功能分享
  3. 苹果语音备忘录可以转文字吗?可以语音转文字的备忘录便签
  4. python学习笔记_week22
  5. Java响应式流框架Reactor中的Mono和Flux
  6. 温水煮青蛙,我还能活多久
  7. ConcurrentHashMap 的理解
  8. 讯飞语音转文字_录音实时转文字就是如此简单 讯飞智能录音笔SR701评测
  9. c/c++程序员发展方向
  10. 五金机械行业网站建设方案