七月在线Python数据分析 第7课时课程笔记
噎肆唉肚
感谢所有。
1 人赞同了该文章
偶然的机会接触到七月在线数据分析这个课程,因为工作需要,于是我也加入了这个学习的大军中,收获也颇丰。
课程链接:https://www.julyedu.com/course/getDetail/66
一、课程的主要内容
1. ndarray:一种多维数组对象
ndarray是一个通用的同构数据多维容器,其中的所有元素必须是相同类型的。ndarray含有两个属性:
shape: 一个表示各维度大小的数组dtype:一个用于说明数据类型的对象
1.1 创建ndaray
1) array函数
它接受一切序列型的对象(list/set/tuple/ndarray/…)。除非显式说明,np.array会尝试为新建的这个数组推断出一个较为合适的数据类型:
import numpy as nparr1 = np.array([1,2,3,4,5])arr2 = np.array([[1,2,3,4], [5,6,7,8]]) # 二维数组
2) zeros/ones/empty函数
创建指定长度或形状的全0或全1或空数组,只需传入一个表示形状的元组(tuple)即可:
np.zeros(10)np.ones((3,6)np.empty((2,3,2)) #注意返回的并不是全0数组,而是未初始化的随机值
3) linspace函数:linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
返回在start到stop之间均匀分布的num个数字,可以选择是否包括stop. retstep表示是否返回步长.
np.linspace(1,5,5,True)Out[4]: array([ 1., 2., 3., 4., 5.])np.linspace(1,5,5,False)Out[5]: array([ 1. , 1.8, 2.6, 3.4, 4.2])
3) arange函数:arange([start,] stop[, step,], dtype=None)
python内置函数range的数组版
np.arange(15)
4) 其它函数:
由于NumPy关注的是数值计算,因此,如果没有特别指定,数据类型基本都是float64(浮点数)
array 将输入转换为ndarray,默认直接复制输入数据asarray 将输入转换为ndarray,如果输入本身就是一个ndarray就不进行复制ones_like/zeros_like/empty_like 以另一个数组为参数,并根据其形状和dtype创建一个全0/全1/空数组eye/identify 创建一个单位矩阵(对角线为1,其余为0)
1.2 ndaray的数据类型
dtype含有ndarray将一块内存解释为特定数据类型所需要的信息
arr1 = np.array([1,2,3], dtype = np.float64) arr2 = np.array([1,2,3], dtype = np.int32)
NumPy的数据类型:
int8/int16/int32/int64 有符号8/16/32/64位整数,类型代码 i1/i2/i4/i8 (分别为1/2/4/8个字节)uint8/uint16/uint32/uint64 无符号8/16/32/64位整数,类型代码 u1/u2/u4/u8float16/float32/float64/float128 浮点数,类型代码 f2/f4/f8/f16complex64/complex128/complex256 复数,类型代码 c8/c16/c32bool 布尔类型 ,类型代码 ?object Python对象类型,类型代码 Ostring_ 固定长度的字符串类型(每个字符一个字节),类型代码 S 。例如,要创建一个长度为10的字符串,应使用S10unicode 固定长度的unicode类型,类型代码 U 。同字符串(如U10)
数据类型转换: astype方法
int_arr = np.array([1,2,3,4,5])float_arr = int_arr.astype(np.float64)numeric_str = np.array (['1.25', '-9.6', '42'], dtype = np.string_)float_arr = numeric_str.astype(float) # 这里的float是Python的数据类型,NumPy会自动的将其映射到等价的dtype上,即np.float64
注意:astype无论如何都会创建出一个新的数组(原始数据的一分拷贝)
1.3 ndaray与标量的计算
使用数组运算的好处是不写循环即可对数据进行批量运算,即矢量化(vectorization)。需要注意的是:
大小相等的数组之间的任何算术运算都会将运算应用到元素级数组与标量的算术运算会将标量值传播到各个元素
1.4 索引与切片
2.4.1 一维数组
一维数组的索引与切片和Python列表的功能类似,区别在于,数组切片是原始数组的视图,这意味着数据不会被复制,对视图的任何修改都会直接反映到原数组上。NumPy如此设计的目的是为了处理大数据,如果采取复制的方法可能产生性能和内存的问题。
arr = np.arange(10)arr[5:8] = 12arrOut[10]:array([0, 1, 2, 3, 4, 12, 12, 12, 8, 9])
如果一定要复制可以使用copy方法显式的复制。
1.4.2 多维数组
多维数组中,如果省略了后面的索引,则返回对象会是一个维度低一点的ndarray。例如,二维数组中,各索引位置上的元素不再是标量而是一维数组。
arr2d = np.array([[1,2,3], [4,5,6], [7,8,9]])arr2d[2]Out[11]:array([7, 8, 9])arr2d[0][2]arr2d[0,2] # 这两种索引方法等价
1.4.3 多维数组切片
多维数组切片与一维数组稍有不同
arr2d = np.array([[1,2,3], [4,5,6], [7,8,9]])arr2d[:2]Out[1]: array([[1,2,3], [4,5,6]])
可以看出,它是按第0轴(第一个轴)切片的。切片是沿着一个轴向选取元素的。
可以一次传入多个切片,也可以将整数索引和切片混合:
arr2d[:2, 1:]Out[2]: aray([[2,3], [5,6])arr2d[1, :2]Out[3]: array([4, 5])arr2d[:, :1]Out[4]: aray([[1], [4], [7]])
1.4.4 布尔型索引
与算数运算类似,数组的比较运算(如==)也是矢量化的。
names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])data = np.random.randn(7, 4) # 产生7×4的随机数组names == 'Bob'Out[5]: array([True, False, False, True, False, False, False], dtype = bool)