NUMPY INTRODUCTION
原文链接:numpy 介绍和基础使用详解 - 木秀 - 博客园
NUMPY 提供了一个在Python中做科学计算的基础库,重在数值计算,主要用于处理多维数组,用于储存和处理大型矩阵,本身是由C语言开发,比python自身的列表结构要高效的多。
高性能科学计算和数据分析的基础包,总结:
• NUMPY是一个Python科学计算基础库,提供了多维向量
• NUMPY提供了用于数组快速操作的方法,数学,逻辑,排序,选择,线性代数,统计等
• NUMPY采用预编译的C代码完成,效率更高
安装:
1 |
|
使用:
1 |
|
行业惯例将np作为numpy,将pd作为pandas。下文所有np均指的是numpy
认识轴:
轴【axis】:
既然是多维数组,先理清一下轴,类似于我们学习的X、Y、Z
二维数组的轴:
图一
三维数组的轴:
图二
使用NUMPY创建数组:
例:创建一个图一的数组
1 | 2 | 3 |
4 | 5 | 6 |
方法1: np.array([])
a=np.array([[1,2,3],[4,5,6]]) b=np.array([range(1,4),range(4,7)]) c=np.array([[i for i in range(1,4)],[i for i in range(4,7)]])
[[1 2 3]
[4 5 6]]
方法2: np.arange()
#1~6 步数为1
d=np.arange(1,7,1)
[1,2,3,4,5,6]
#将一维数组转变为二维
d=d.reshape(2,3)
[[1 2 3]
[4 5 6]]
常用属性和方法
形状
ndarray.shape
重新改变数组形状
ndarray.reshape(x_dim, y_dim, z_dim,…)
数组的维度
ndarray.ndim
itemsize输出array元素的字节数
numpy.itemsize
数组的形状:
nparray.shape:
#查看数组的形状维度
d=np.arange(1,7,1) print(d.shape)
(6,)
nparray.reshape:
#改变数组的维度,规则1*6==2*3
d=d.reshape(2,3). #或者: d=np.reshape(d,(2,3)) print(d.shape)
(2, 3)
获取数组的维度,可使用len(nparray.shape),即元祖的维度,即numpy.itemsize
将多维数组转换为一维数组方式:
自己动手:
def createOnenp(nparray): num=1 for i in len(nparray.shape): num=num*nparray.shape[i] return nparray.reshape(num)
实际又是自己在造轮子,可使用np自带方法:
nparray= nparray.flatten()
a=np.array([[1,2,3],[4,5,6]]) print(a) a=a.flatten() print(a)
[[1 2 3]
[4 5 6]]
[1 2 3 4 5 6]
数组的计算:
情况一:数组和数值直接运算
a=np.array([i for i in range(1,7)])#生产一维数组 a=a.reshpe(2,3)
[[1 2 3]
[4 5 6]]
数组可以直接与数字进行四则运算(+、-、*、/)
即数组里的每一个值分别四则运算
print(a+2)
[[3 4 5]
[6 7 8]]
print(a/0)
[[inf inf inf]
[inf inf inf]]
在numpy中,/0并不会报错,
inf(infimum)表示无穷,
nan(not a number)代表未定义或不可表示的值,
情况二:数组与数组计算
这里要注意了,数组和数组的计算和矩阵是不同的
矩阵的乘积:
数组的乘积:
相同的多维数组或直接与单维度轴相同,可以直接四则运算:
方式:广播(broadcast)
a:
[[1 2 3]
[4 5 6]]
print(a*a)
[[ 1 4 9]
[16 25 36]]
b:
[1 2 3]
print(a*b)
[[ 1 4 9]
[ 4 10 18]]
c:
[[1]
[2]]
print(a*c)
[[ 1 2 3]
[ 8 10 12]]
数组的操作:
1、转置操作
a=np.array([i for i in range(1,7)])#生产一维数组 a=a.reshpe(2,3)
[[1 2 3]
[4 5 6]]
- a.T
[[1 4]
[2 5]
[3 6]]
- a.transpose()
[[1 4]
[2 5]
[3 6]]
- a.swapaxes(1,0) #交换0轴和1轴
[[1 4]
[2 5]
[3 6]]
2、切片
a=np.array([i for i in range(1,10)])#生产一维数组 a=a.reshpe(3,3)
[[1 2 3]
[4 5 6]
[7 8 9]]
2.1取行
2.1.1、取第x行
print(a[x])
print(a[1])
[4 5 6]
2.1.2、取多行
print(a[[x,x]])
print(a[[0,2]])#取第一行和第三行
[[1 2 3]
[7 8 9]]
2.1.3、取连续多行
print(a[x:y:z]) #连续取从x行到y行,不包括y,间隔为z
print(a[0:3])#取第一行到第四行不包括第四行,也就是前面三行,和list切片类似,左闭右开
[[1 2 3]
[4 5 6]
[7 8 9]]
print(a[0:3:2])
[[1 2 3]
[7 8 9]]
2.2取列
和取行类似
a[:,x]#取x列
a[:,x:y]#取下标为x到下标为y-1的列
a[:,x:y:z]#取下标为x到下标为y-1,间隔为z的列
a[:,[x,y]] #取下标为x,y的两列
2.3取某一点
a[1,1]=a[1][1]
5
2.4取某一部分
print(a[1:3,1:3])
[[5 6]
[8 9]]
布尔索引、三元运算、裁剪
a=np.array([i for i in range(1,10)])#生产一维数组 a=a.reshpe(3,3)
[[1 2 3]
[4 5 6]
[7 8 9]]
布尔索引:
print(a>5)
[[False False False]
[False False True]
[ True True True]]
print(a[a>5])
[6 7 8 9]
a[a>5]=5 print(a)
[[1 2 3]
[4 5 5]
[5 5 5]]
三元运算:
data1=np.where(a<5,1,9)#比5小的全部修改为1,其他的改为9 Print(data1)
[[1 1 1]
[1 9 9]
[9 9 9]]
裁剪
data2=a.clip(3,7)#小于3的替换为3,大于7的替换为7 print(data2)
[[3 3 3]
[4 5 6]
[7 7 7]]
常用的统计函数
求和:nparray.sum(axis=None)
均值:nparray.mean(axis=None) 受离群点的影响较大
中值:np.median(nparray,axis=None)
最大值:nparray.max(axis=None)
最小值:nparray.min(axis=None)
极值:np.ptp(nparray,axis=None) 即最大值和最小值只差
标准差:nparray.std(axis=None)
其他方法
获取最大值最小值的位置
np.argmax(nparray,axis=0)
np.argmin(nparray,axis=1)
创建一个全0的数组: np.zeros((3,3))
[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]
创建一个全1的数组: np.ones((3,3))
[[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]
创建一个对角线为1的正方形数组(方阵):np.eye(3)
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
NUMPY中的复制操作
a=b 完全不复制,a和b相互影响
a = b[:],视图的操作,一种切片,会创建新的对象a,但是a的数据完全由b保管,他们两个的数据变化是一致的,
a = b.copy(),复制,a和b互不影响
等等用法:
• numpy.sort()
• numpy.amin() numpy.amax()
• numpy.mean() numpy.average()
• numpy.std() # sqrt(mean((x - x.mean())**2))
• numpy.var() # mean((x - x.mean())** 2)
• numpy.sin() cos() tan() pi arcsin(), arccos() arctan() degrees()