numpy类库是数据分析的利器,用于高性能的科学计算和数据分析。使用python进行数据分析,numpy这个类库是必须掌握的。numpy并没有提供强大的数据分析功能,而是它提供的ndarray数据结构能够让你快速的处理海量的数据。
shape和dtype属性
ndarray是numpy的多维数组对象,是numpy类库中主要的数据结构,它有两个重要的属性,shape和dtype,shape是描述数组维度的元组,dtype用于说明数组数据类型。
data = [1,2,3,4,5] arr1 = np.array(data) arr1 Out[6]: array([1, 2, 3, 4, 5]) arr1.shape Out[7]: (5,) arr1.dtype Out[8]: dtype('int32')上面代码说明可arr1是长度为5的一维数组,数据类型是int32。
ndarray数组的数据都是整数时,数据类型是int32,当有小数时,数据类型则是float64。
ndarray数组中的数据必须是同一类型,如果有不同类型的数据,dtype为<U11。
numpy主要用于处理数据,因此ndarray数组中的数据必须是同一数据类型,否则无法进行数学计算。
创建ndarray
numpy提供了array函数创建ndarray对象,array函数要传入一个list列表类型的对象。
list1 = [1.2,2.3,4.6,7.8] ndarray1 = np.array(list1) ndarray1 Out[22]: array([1.2, 2.3, 4.6, 7.8])传入的list列表是等长的多维列表时,创建的是多维的ndarray数组对象。
list2 = [[1.2,2.3,4.6,7.8],[12.2,13.5,1.6,9.8]] ndarray2 = np.array(list2) ndarray2 Out[25]: array([[ 1.2, 2.3, 4.6, 7.8], [12.2, 13.5, 1.6, 9.8]])多维列表的长度不一致时,生成ndarray对象的数据类型dtype就变成object,不是具体的数据类型。
list3 = [[1.2,2.3,4.6,7.8],[12.2,13.5,1.6,9.8,0.8]] ndarray3 = np.array(list3) ndarray3 Out[28]: array([list([1.2, 2.3, 4.6, 7.8]), list([12.2, 13.5, 1.6, 9.8, 0.8])], dtype=object)numpy还提供了zeros和ones两个方法分别用于创建值为0或者1的数组。
使用zero方法创建数组值为0的ndarray数组:
np.zeros(5)//创建长度为5,数组值都为0的ndarray一维数组 np.zeros((3,4))//创建3行4列,数组值都为0的二维数组 np.zeros((3,4,5))//创建维度为3,值为0的ndarray三维数组。只用ones方法创建数组值都为1的ndarray数组:
np.ones(5)//创建长度为5,数组值都为1的ndarray一维数组 np.ones((3,4))//创建3行4列,数组值都为1的二维数组 np.ones((3,4,5))//创建维度为3,值为1的ndarray三维数组。arange()方法直接调用python内置的range()函数生成初始值为0步长为1的数组:
data3 = np.arange(13) data3 Out[12]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])empty()方法创建一个新的数组,数组值是随机生成,用于占用内存空间:
data4 = np.empty((2,2)) data4 Out[20]: array([[7.32086553e-315, 1.01777082e-311], [0.00000000e+000, 7.31249282e-315]])类型转换
ndarray提供astype方法将数据类型转换为其他的数据类型。
将浮点数转为整数时,会自动截取掉小数部分:
data5 = np.array([2.2,3.4,5.6]) data6 = data5.astype(np.int32) data6 Out[23]: array([2, 3, 5])astype可以将全是数字的字符串数组转换为数值形式:
data7 = np.array(['2.4','3.5','4.6']) data8 = data7.astype(np.float64) data8 Out[34]: array([2.4, 3.5, 4.6])数组间的数学运算
两个数组之间是可以进行加减乘除间的数学运算。
两个数组之间的相加:
data1 = np.array([1,2,3,4]) data2 = np.array([5,6,7,8]) data3 = data1 +data2 data3 Out[38]: array([ 6, 8, 10, 12])两个数组之间相减:
data1 = np.array([1,2,3,4]) data2 = np.array([5,6,7,8]) data3 = data1 - data2 data3 Out[45]: array([-4, -4, -4, -4])两个数组之间相乘:
data1 = np.array([1,2,3,4]) data2 = np.array([5,6,7,8]) data3 = data1 * data2 data3 Out[49]: array([ 5, 12, 21, 32])两个数组之间相除:
data1 = np.array([1,2,3,4]) data2 = np.array([5,6,7,8]) data3 = data1 / data2 data3 Out[53]: array([0.2 , 0.33333333, 0.42857143, 0.5 ])两个数组之间进行数学运算时,数组之间的shape对象值必须一致,就是长度必须一致。否则会报ValueError: operands could not be broadcast together with shapes 的错误:
data1 = np.array([1,2,3,4]) data2 = np.array([5,6,7,8,9]) data3 = data1+ data2上面的代码会报ValueError: operands could not be broadcast together with shapes (4,) (5,) 错误,data1数组的shape为(4,),data2的shape为(5,),两者不一样,无法进行数学运算。
数组的索引和切片
通过索引可以访问NumPy数组某个位置上的数值。数组索引从0开始,于长度-1结束:
data1 = np.arange(10) data1.size Out[73]: 10 data1[0] Out[74]: 0 data1[9] Out[75]: 9 data1[10]在上面的代码中,长度为10的一维度数组data1,索引从0开始,于9(长度10-1)结束。通过data1[9]访问到数组中的第10个元素,如果通过data1[10],则会出现IndexError: index 10 is out of bounds for axis 0 with size 10的错误,俗称数组越界。