python之所以如此强大,是因为它提供了许多高效便捷的数据分析工具包
数据分析中常用的三个利器:
Numpy和Pandas主要用来处理一维和二维的表格数据,Matplotlib库处理数据可视化
下面的python代码全部使用jupyter notebook进行编辑运行。
关于numpy中的空值介绍:
关于Numpy副本与视图:
视图:
视图一般发生在:
副本
副本一般发生在:
创建一个数组:
numpy.array(object,dtype=None,copy = True,order = None,subok = False,ndmin = 0)
创建 一个一维数组
import numpy as np # 导入numpy包 起别名
list01 = [1,2,3,4] #创建列表a
array01 = np.array(list01)
print(array01)
print(type(array01))
创建一个二维数组,如果array函数中从传入的是嵌套列表,也就是多层等长序列嵌套而成的序列,函数将返回一个多维数组
list02 = [[1,2],[3,4],[5.6]]
array02 = np.array(list02)
print(array02)
print(type(array02))
对比一下数组与列表,会发现打印出来的差别:数组没有逗号,列表含有逗号。
Numpy中定义了一些可以创建特殊数组的方法,比如numpy.zeros可以创建特定长度、元素为0的一维或多维的数组,可以被用来初始化数组;numpy.ones可以创建元素都为1的特定数组,numpy.empty可以用来创建没有具体数值的数组,只需要传入数组的形状即可,也可以用来初始化数组;numpy.arange函数类似于Python中的range函数,但是返回值是数组类型,numpy.eye可用来创建指定边长和dtype的单位矩阵
这里以empty为例子说明一下:numpy.empty方法是用来创建一个指定的形状(shape)、数据类型(dtype)且未初始化的数组。
numpy.empty(shape,dtype = float,order = ‘C’)
参数说明:
数组的数据类型保存在dtype中,可以直接使用dtype函数进行查看。
在创建ndarray时,dtype可以作为一个参数将一块内存解释为特定的数据类型。比如下面这个例子。
这里shape属性是一个列表参数,dtype属性是np.int32。
可见:dtype的命名方式是:类型名+元素位长。
对于已经创建好的ndarray,可以使用astype函数转换数据类型,例如:
解析:整型数值被转换成了浮点数
但是,如果将浮点数转换成整数类型的话,会将原来的小数部分全部去掉,并非是四舍五入。
还有,如果一个数组中的每一个元素都是字符串,且字符串表示的是数字,可以使用astype函数将其转换成数值类型。
其余的类似。
当学习轴的概念之后,计算一个二维数组的平均值,必须指定是计算哪一个方向的数字平均值,参数axis = 0或者axis = 1,在计算的时候,可以想象成一个坐标轴,分别计算这两个轴上面的每一个刻度上的值,或者二维数组中记住0表示行1表示列
后续,待补充
使用shape查看数组的维度大小,shape函数将返回一个元组对象,arr.shape[0] 将 输出第一维的长度,arr.shape[1]将输出第二维的长度,以此类推,如果数组是一维数组,shape函数将返回(n,),n是一维数组的长度,也是元素的个数,逗号后面为空,表示这是一个元组类型 , 如果是二维数组,将返回一个(n1,n2),第一个值n1表示行数,第二个n2表示列数,返回值同样是元组对象。
注意:如果元组中只包含一个元素,那么该元素之后需要添加逗号,声明这是一个元组(tuple),否则括号会被当作数学运算中的小括号来使用。
使用reshape属性可以更改数组的结构,原数组的shape属性仍然保持不变。
比如原来的数组是两行四列,现在将他编程四行两列,其实也就起到一个转置的效果。
可以看到:array01数组仍然保持了原来的结构,在新的数组a中各元素的内存位置其实没有变化,只是改变了每一个维度的长度,原来的数组array01和现在的数组a共享同一片内存区域,所以对其中一个数组的数组元素进行改变都会引起另一个数组内容发生变化
比如,我现在更改数组的元素:
可以看到对array01的修改直接带来了a的修改
介绍一下索引与切片:
注意:Numpy数组与列表切片的不同之处在于,数组切片的操作对象并不是副本,而是原始数组试图,也就是对于视图上的所有修改,原数组都会随之改变,而数据不会被复制,所以Numpy可以用于处理数据量较大的数据集,减少拼音为复制数据带来的内存和性能问题。如果不希望修改源数据,需要做显式复制操作,可以使用copy函数。
比如,下面的案例:
numpy的切片操作直接修改原数据,对于视图的操作。直接改动原有的数组
可以发现,通过copy函数复制的数组,没有将原数组进行改动。
所以,第一个是深复制,后面一个是浅复制
对于二维数组,每一个索引位置对应的元素不再是标量,而是一维数组。
对于多维数组的索引,返回对象是降低维度之后的索引
比如,下面这个例子。这里先生成一个0-15的数组,在将这个数组进行重构,重构成一个三维数组。
我们可以清楚的看到,每个行列索引对应的并非是一个标量,而是一个一维数组。
这里,arr3d[0][0]对应的是第一维度1与第二维度1索引位置相交的元素
ndarray的切片索引只需将数组中的每一行每一列都分别看做成一个列表,参照列表切片的索引方法,最终返回一个数组类型的数据
解释:索引遵循区间左闭右开的原则,不包含右侧的索引值,这里,先去处行索引1,也就是第二行数据,再取出列索引2:4,也就是第二列和第三列,对应的数字是7、8
布尔型索引作为数组的索引时,会根据布尔数组的True或者False值筛选对应轴上的数据。
比如,下面这个例子,这里取得是x=1的索引位置的值,x!=1的索引位置输出false.
布尔索引取出布尔值为True的行
布尔型索引可以与切片进行使用。
布尔型索引不仅可以设置正向条件,还可以设置反向条件。
布尔型与或索引:
print(arr12[(x==1) | (x==0)])
# 选择的是索引x=1以及 x = 0所对应的数组
使用布尔型索引可以将数组中满足条件的所有元素全部筛选出来:
# 使用布尔型索引将数组中大于十的数据全部修改为10
arr12[arr12 > 10] = 10
print(arr12)
over, 后续进行补充