numpy是python的一种数据计算的包,首先我想说一下它的优点
在我看来有两点在于:1.可以省略许多计算过程,方便计算。2:相比较于正常的python计算可以加速计算过程。
def python_sum(n):
a=[i**2 for i in range(n)]
b=[i**3 for i in range(n)]
ab_sum=[]
for i in range(n):
ab_sum.append(a[i]+b[i])
return ab_sum
def numpy_sum(n):
a=np.arange(n)**2
b=np.arange(n)**3
return a+b
numpy_sum(10)
从中可以看出运用python本身的运算和利用numpy的运算的时间差距是非常大的,这也是我们数据分析中喜欢运用numpy的原因。
1.numpy的array方法
最基础的方法就是在array中添加一个数组,这样就可以写出numpy方法中的数组,方便后边利用numpy其他方法运算。
1.1array中运用range方法
跟在正常运算中一样,直接用range方法可以省略掉许多步骤,当你在运算一定范围内的数组时可以节省很多时间。
另外range()前两个数字分别是起始值和终止值,运算时不包括最后一个终止值,而第三个数字则是类似于等差数列的d一样可以有效划分数组类似于奇数偶数组。
1.2array中dtype方法
如果要规定数组的类型,可以添加dtype,类似于图中的int之外还可以运用float等类型。
1.3numpy中的复制
一般都是使用图中的复制,这样的话存储地址不一样,因此在修改b的时候 a不会因此而变化造成数值不稳定。
以下即是反例:
除此之外,我们可以注意到其中的copy的值,类似于第一张图,copy的值默认为True,因此地址未改变。
但若我们将copy的值改成False,地址又会相同:
当然还有更方便的使用copy()的方法:
id显示出来也是不同的,可以很方便的使用
1.4数组的计算
加法运算直接是普通的数组加法,但是要注意的是,数组的列或者行的数量需要相同,否则会报错
1.5求平均值
如果不添加axis的参数的话,那么输出的均值就是数组内所有数字的均值
axis = 0:压缩行,对各列求均值,返回 1* n 矩阵
axis =1 :压缩列,对各行求均值,返回 m *1 矩阵
1.6求中位数
简单的利用median方法就可以求得
1.7求方差
在数据分析中很有用,可以比较数据的离散型
2.numpy数组的区间,等差等比方法
2.1numpy的arange方法
arange方法经常被使用,和range方法相同的点在于可以很好的输出一些固定范围的数组,但是不同点在于range输出的是数组类型,而arange前面加上np.就可以输出array形式的数组。
但我们需要注意的一点就是当里面的数字范围是小数点的时候,终止值也会被包括在内,这涉及到了python内部计算的时候的问题。
2.2numpy的linspace等差数列方法
和range方法类似起始终止是前面两个数,但是最后一个数不是步长, 而是数组中的元素个数。
除此之外还可以用endpoint来决定是否要包括终止值,图中就是包括终止值的,说明endpoint默认值是True,另外还有setstep可以输出步长的大小
在数据分析中这是很实用的方法,可以提供很多的样本
2.3numpy的logspace等比数列方法
与linspace类似,但是多了个base,大抵就是对base这个值来求对数。图中就是base为2,起始值为0值为2的0次方为1,终止值为2的9次方512.。
同样可以运用于创造多样本数组
3.numpy中修改维度的方法
3.1resize方法
resize有两种方法,一种有返回值,一种没有返回值
第一种有返回值,是将修改过的数据赋值给新变量,而数组本身不会变化。通知如果维度所包含的元素个数大于或小于本身变量,那么同样也会继续改变size,通过按顺序输出数组本来的数字来构成新的数组
第二种通过赋值没有返回值,而且会改变a本身的值,其他没什么改变。
另外我们可以引入size方法
size方法可以显示有多少维度类似于2*2就是4
而len()方法就有些欠缺,并不能将多维数组长度输出
3.2reshape方法
与resize相同之处在于reshape也可以改变维度,但是reshape方法不会改变数组中元素本身,否则会出错。
4.numpy的切片
4.1数组基础切片
与正常python中数组的切片一样,第一个数字为标签起始值,第二个数字为标签终止值(不包括),最后一个数字则为步长。
当不写值的时候第一个值默认为初始值,第二个值默认为终止值,步长为-1时倒叙切片
另外步长为空默认也是为1
对于多维数组,我们切片的时候可以单独取一个值,作为降一维的“标签”,
4.2按列切片
我们通常可以使用...来表示“所有值”这种含义,在切片的时候逗号前为行逗号后为列。因此此处的。。。表示取行所有值,而后面的数字表示按列的标签开始输出,比如这里从标签1到结尾。
但是要注意好这两种表达是不同的,前者是没有直接取出来行,后者是把行一个个都取出来,然后再取行中间的第几个。在单独取一个值的时候并不会看出有很大问题,但是在对付多列多行的问题的时候就会出错。
而对于直接书写数组的类型
也是通过逗号前为行,逗号后为列这样一一对应找数字。这里通过r和l就是来说明其中原理也是通过按行取列。
4.3数组切片与数字直接切片
图中b和c输出结果相同,但是b是直接通过数字切片,而c中关于列的部分是通过数组直接区分【1,2】就是标签为1,2的列。
4.4根据数组范围切片
譬如第一种,对数组中的数字进行比较来输出
还有输出数组中的奇数偶数的操作
4.5根据Boolean来切片
True的部分就是输出的部分,这里只标记了二三行,因此输出二三行的数据
除此之外还要记住行与列的True的数量需要相同,不然也会报错
5.numpy的random随机数
5.1randn方法
可以输出一定样本内的正态分布,这里用matplotlib的hist方法直观看
5.2rand方法
可以输出0到1内的均匀随机数,括号里输入的是你想要的数组维度
同样可以用柱状图看出随机的分布,与正态分布比起来差距很大,随机数的分布并不是很分明
5.3randint方法
比较常用的随机数方法,由范围以及数组的维度确定,不输入size的时候默认为只返回一个数字
5.4sample方法
同样是输出0到1的随机数,括号内表示2行3列控制维度
5.5normal方法
与前者rand一样表示为正态分布的数据,但这里的数值不局限于0到1,loc是第一个数值,表示以这个数为中心,scale表示为第二个数值,是关于这个数的标准差,宽度。而最后的元组表示为维度
5.6seed方法
通常在数据分析的时候,我们不想随机的样本第二次运行还会改变,因此我们可以通过使用seed方法来限制随机的样本的变化
一个seed可以限制一个random,每次写random都要在前面加一个seed()才能限制。
6.numpy的zeros()和ones()方法
这两种方法能方便的创建一定规模的数组,元素全为0或者全为1这样子。在数据线性分析的时候theta就可以通过这种方法创建。同时我们也可以一定程度上对其切片,以下就是将其切片成01层次间隔的形式。