本篇文章主要包括两部分:
numpy简介
array结构介绍
一.numpy简介
numpy是pyhon中一个非常常用的科学计算库,它主要用来处理对数组的运算,numpy的绝大部分API都是针对数组的操作,特别是多维数组。
numpy的底层是一个ndarray结构,我们可以通过numpy.array(list)将一个列表转化为一个ndarry类型的数据结构。我们可以把ndarry结构看成是一个加强版的列表,它的本质仍然是一个列表,只是额外封装了一些方法和属性,使得它比list更加强大(也就是说,list能做的事,ndarray都能做,ndarray能做的事,list就不一定能做。正是有了ndarry结构,使得numpy能像matlab一样方便的操作数组)。与list相比,ndarray有如下特性:
ndarray类型的数组可以直接加减乘除某一个常数
import numpy as np list=[1,2,3,4] array=np.array(list) array+1 #对数组中的每一个元素+1 array*1 #对数组中每一个元素*1 array/2 array-1
上面的操作若是对list进行,则会报错.
二.ndarray结构
1.numpy.array(list)将list转为array结构
import numpy as np list=[1,2,3,4,5,6,7] array=np.array(list)
2.为了方便数组的计算,ndarray中的数据类型应该是一致的,这与list有区别,如果在创建ndarray时,数据类型不一致,会自动向下转化为相同的数据类型
list=[1,2,3,4,5,6] array=np.array(list) #list的数据类型都是int型,因此array的数据类型是int list=[1,2.9,4.5,4.7] array=np.array(list) #list的数据包含int和浮点型,array会自动把数据全部转为浮点型 list=[1,2,'uh',4] array=np.array(list) #list的数据中包含int和字符串,array会全部把数据转为字符串
3.ndarray基本属性操作
array=np.array([[1,2,3], [3,4,5]]) type(array) #返回array的数据类型(numpy.ndarray) array.dtype #返回array数组中的数据的数据类型 array.itemsize #数组中每一个数据所占的字节 array.shape #数组的结构,返回一个元组,元组中的每一个数据代表着数组在每一维有多少个数据 array.size #数组中元素的总个数 array.ndim #返回数组的维度,即数组总共有多少维 array.fill(0) #用0来填充array,即将array的所有数据都变成0
4.ndarray的切片
ndarray的切片操作和list的切片操作类似:
#######################################索引与切片操作 #1.一维矩阵的索引和切片操作与list完全一致 list=[1,2,3,4,5,6,8] array=np.array(list) array[0] #返回索引为0的值(1) array[1:5] #返回索引从1到5的值(不包括5) array[-1] #返回最后一个元素 #2.多维矩阵的索引和切片操作与list类似 list=[[1,2,3], [4,5,6], [7,8,9]] array=np.array(list) array[0] #返回索引为0的值,即第一行的元素(想想list[0]会返回什么值,这里是一致的) array[1,1] #返回第二行第二列的元素(索引从0开始) array[:,1] #返回第二列元素 array[:2] #返回前两行元素(注意区分有逗号和没有逗号的区别) array[1,1]=10 #可以根据索引直接修改该位置的数据(与list一致) array[0,0:2] #可以结合索引和切片来查找矩阵中某些特定位置的数据,需要记住,矩阵的不同的维度是根据逗号分隔的 #3.矩阵的复制有深浅拷贝之分 array1=array #浅拷贝,array1只是拷贝了array的一个引用,两个变量指向同一块内存(指向同一个矩阵),操作一个变量,另外一个变量值也会改变 array1[1,1]=10 #将array1的第二行第二列元素改为10,因为array1和array实际上指向同一个矩阵,因此array的第二行第二列元素也会变成10 array1=array.copy() #深拷贝,array1和array是两个完全独立的矩阵,操作一个矩阵不会影响另外一个矩阵 array1[1,1]=100 #将array1的第二行第二列改为100,因为array1和array两个矩阵是相互独立的,因此array第二行第二列元素还是10,不会变成100 #4.arange函数和random.rand函数,根据布尔值来筛选数据 ####arange函数的用法和range函数相同,两者区别在于,arange生成的是一个ndarray矩阵,range生成的是一个list array=np.arange(0,100,10)#返回 array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90]) ##生成一个布尔类型的矩阵 mask=np.array([0,1,0,1,1,0,0,1,0,1],dtype=bool) ##根据mask来筛选矩阵中的数据,返回array中以mask中值为1的索引作为索引的对应的值 ####注意:mask的元素个数必须与array中元素个数相同,即mask.size==array.size array[mask] #返回array([10, 30, 40, 70, 90]) ##除了自己定义一个bool矩阵之外,还可以利用array的数据大小来生成bool矩阵 mask=array>50 #mask是一个和array有着相同size的矩阵,若array[i]的值大于50,则mask[i]为true,否则为false array[mask] #使用这种方法可以很方便的在array矩阵中筛选出符合我们想要的数据 np.where(array>50) #使用where方法可以查看符合条件的元素的位置 ##random.rand()函数 #arry=np.random.rand(10) #生成一个size=10的一维矩阵,矩阵的每一个元素的值在0-1之间
5.ndarry中元素的数据类型转换
#在创建矩阵时,可以通过指定dtype属性来指定矩阵数据的数据类型 array=np.array([1,2,3,4,5],dtype=np.float32) #指定生成的数据是32位的浮点类型 array.nbytes #计算矩阵的总共字节数(5*4=20) ##前面说过,ndarray类型的矩阵会将数据类型统一向下转为同一种类型,如果想让矩阵像list那样,矩阵的元素有不同的数据类型,可以使用object类型 array=np.array([1,2,'stre',4],dtype=np.object) #生成的矩阵既有int类型的数据,又有字符串类型的数据 #除了可以在创建矩阵时指定dtype属性外,还可以使用asarray(),astype方法来实现矩阵数据类型的转换 array=np.array([1,2,3,4,5]) array1=np.asarray(array,dtype=np.float32) #需要注意,这种转换不会改变array的数据类型,因此需要将转换后的矩阵赋给一个新的变量 array1=array.astype(dtype=np.float32) #该方法也不会改变array的数据类型