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

电脑环境

电脑环境:Windows 10 教育版

Python:python3.6

概述

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

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

list1=[1,2,3,'a']  
print list1  

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

运行结果:

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

创建:

1、 array的创建:参数既可以是list,也可以是元组.使用对应的属性shape直接得到形状

a=np.array((1,2,3,4,5))# 参数是元组  
b=np.array([6,7,8,9,0])# 参数是list  
c=np.array([[1,2,3],[4,5,6]])# 参数二维数组  
print(a,b,
    c.shape) 

结果:

[1 2 3 4 5] [6 7 8 9 0] (2, 3)

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

c = np.array([[1, 2, 3, 4],[4, 5, 6, 7], [7, 8, 9, 10]])  
c.shape # (3L, 4L)  
c.shape=4,-1   #c.reshape((4,-1))  
print(c)   

结果:

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

这里的reshape最终相当于是一个浅拷贝,也就是说还是和原来的c使用相同的内存空间

c = np.array([[1, 2, 3, 4],[4, 5, 6, 7], [7, 8, 9, 10]])  
c.shape # (3L, 4L)  
d=c.reshape((4,-1))
d[2:4]=100  
print(d) 

结果:

[[  1   2   3]
 [  4   4   5]
 [100 100 100]
 [100 100 100]]

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

arr1=np.arange(1,10,1) #   
arr2=np.linspace(1,10,10)  
print (arr1,arr1.dtype)  
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。

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

def fun(i):  
    return i%4+2  
a = np.fromfunction(fun,(10,))  
print(a)

结果:

[2. 3. 4. 5. 2. 3. 4. 5. 2. 3.]

fromfunction必须支持多维数组,所以他的第二个参数必须是一个tuple,只能是(10,),(10)是错误的。

def fun2(i,j):  
    return (i+1)*(j+1)  
a = np.fromfunction(fun2,(9,9))  
print(a)

结果:

[[ 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的设计更加符合我们的使用。
5、涉及到矩阵的运算再使用mat,那么list主要就是用进行元素的索取。

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

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

猜你喜欢

转载自blog.csdn.net/qq_39516859/article/details/80615461