目录
一.前言
二.numpy库基础知识
2.1数组的芝士:
2.2 创建数组
2.3改变数组形状
2.4数组的运算
2.4.1数组与实数的运算
2.4.2数组与数组的运算
三.numpy读取数据
3.1基本概念(轴)
3.2 numpy读取数据
3.3 numpy转置方法(补充)
四. numpy的索引与切片
4.1常见的切片索引需求
4.2 numpy中数值的修改
4.3 布尔索引
4.4 三元运算符(where)和裁剪(clip)
4.5 numpy中的nan和inf
4.6 numpy中常见的统计方法
4.7 numpy应用实例(数据处理)
五. 数组的拼接
5.1 拼接的方式(水平/竖直)
六.numpy生成随机数
6.1常用参数
6.2 numpy的注意点
笔记学习内容主要来源:NumPy 教程 | 菜鸟教程 (runoob.com),其中个别函数具体使用方法可参考网页中的内容。
numpy库的应用:通常与scipy(scientific python)和matplotlib(绘图库)结合使用,这种组合主要是为了替代matlab,有助于我们用python学习数据科学和机器学习。
nadarry:数组
1.数据类型(dtype)#类似python中的数据类型,可进行选择,例如:bool;int;float;complex;
2.数组形状(shape)#用来描述数组中的数据为几行几列。
数组的常用属性:
ndarray.ndim | 秩,即轴的数量或维度的数量 |
ndarray.shape | 数组的维度,对于矩阵,n 行 m 列 |
ndarray.size | 数组元素的总个数,相当于 .shape 中 n*m 的值 |
ndarray.dtype | ndarray 对象的元素类型 |
示例
import numpy as np
a=np.array(range(10),dtype=int) #dtype可以指定数据类型,如float#
print(a)
print(a.shape) #输出数据形状
b=a.reshape((2,5)) #改变a的数据形状为2行5列
print(b)
print(b.shape)
print(a.dtype) #输出a中的数据类型
print(type(a))
输出:
[0 1 2 3 4 5 6 7 8 9]
(10,) #代表一维数据,1行10列
[[0 1 2 3 4]
[5 6 7 8 9]]
(2, 5)
int32
代码:
#三种方法如下:
import numpy as np
a=np.array([1,2,2,3,4]) #方法一
b=np.array(range(1,10)) #方法二
a=np.array([[1,2,2,3,4],[2,3,4]]) #方法二,必须放在一个【】中,否则会报错
c=np.arange(1,6) #方法三
print(a)
print(b)
print(c)
输出:
[1 2 2 3 4]
[1 2 3 4 5 6 7 8 9]
[list([1, 2, 2, 3, 4]) list([2, 3, 4])]
[1 2 3 4 5]
shape 和 reshape
import numpy as np
a=np.array([[1,2,3],[4,5,6]])
print(a)
print(a.shape) #获取a的数组形状
#改变数组形状需注意改变后的大小不变
a1=a.reshape((3,2)) #将a改为3行2列
a2=a.reshape((6,)) #将a改为一维
a3=a.reshape((6,1)) #将a改为6行1列
a4=a.reshape((1,6)) #将a改为1行6列
a5=a.reshape((a.shape[0]*a.shape[1],)) #a.shape[0]和a.shape[1]分别代表行和列
a6=a.flatten() #将a转为一维形状
print(a1)
print(a2)
print(a3)
print(a4)
print(a5)
print(a6)
输出:
[[1 2 3]
[4 5 6]]
(2, 3)
[[1 2]
[3 4]
[5 6]]
[1 2 3 4 5 6]
[[1]
[2]
[3]
[4]
[5]
[6]]
[[1 2 3 4 5 6]]
[1 2 3 4 5 6]
[1 2 3 4 5 6]
运算:加减乘除;分为数组与实数的运算,数组与数组的运算;代码示例如下
import numpy as np
#创建一个数组
a=np.array([[0,1,2,3,4,5],
[6,7,8,9,10,11],
[12,13,14,15,16,17],
[18,19,20,21,22,23]])
#数组与实数的加法:将数组的每一个数都相加
print(a+2)
#数组与实数的乘法:将数组的每一个数都相乘
print(a*2)
#数组与实数的除法:将数组的每一个数都相除;可以对0进行运算(其中inf:无穷大;nan:非实数)
print(a/2)
print(a/0)
输出
[[ 2 3 4 5 6 7]
[ 8 9 10 11 12 13]
[14 15 16 17 18 19]
[20 21 22 23 24 25]]
[[ 0 2 4 6 8 10]
[12 14 16 18 20 22]
[24 26 28 30 32 34]
[36 38 40 42 44 46]]
[[ 0. 0.5 1. 1.5 2. 2.5]
[ 3. 3.5 4. 4.5 5. 5.5]
[ 6. 6.5 7. 7.5 8. 8.5]
[ 9. 9.5 10. 10.5 11. 11.5]]
[[nan inf inf inf inf inf]
[inf inf inf inf inf inf]
[inf inf inf inf inf inf]
[inf inf inf inf inf inf]]
import numpy as np
#创建一个数组
a=np.array([[0,1,2,3,4,5],
[6,7,8,9,10,11],
[12,13,14,15,16,17],
[18,19,20,21,22,23]])
#创建一个形状相同的数组进行运算
b=np.arange(100,124).reshape((4,6))
print(a+b) #对应元素相加或乘除,这里就不演示了
#创建不同维度的数组进行运算
c=np.arange(0,6)
print(a+c) #因为列相同所以每列可以进行运算
d=np.arange(0,4).reshape((4,1))
print(a+d) #因为行数相同所以也可以进行运算,即每行进行相加减
#总结:只要运算的数组行与列其中存在相同就可以运算满足广播原则,对于三维只要存在某个空间形状相同也可以进行运算。
###广播原则如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符,或其中的一方的长度为1,则认为它们是广播兼容的。
#广播会在缺失和(或)长度为1的维度上进行。 这句话乃是理解广播的核心。 广播主要发生在两种情况,一种是两个数组的维数不相等,但是它们的后缘维度的轴长相符,
#另外一种是有一方的长度为1。
输出
[[100 102 104 106 108 110]
[112 114 116 118 120 122]
[124 126 128 130 132 134]
[136 138 140 142 144 146]]
[[ 0 2 4 6 8 10]
[ 6 8 10 12 14 16]
[12 14 16 18 20 22]
[18 20 22 24 26 28]]
[[ 0 1 2 3 4 5]
[ 7 8 9 10 11 12]
[14 15 16 17 18 19]
[21 22 23 24 25 26]]
axis:可以理解为方向,使用数字0,1,2等数字表示,对于一维数组,只有一个0轴;对于2维数组(shape(2,2)),有0轴和1轴,引入这个概念是为了计算数组的平均值的时候,可以进行指定是哪个方向上的数字的平均值。例如:
np.arange(0,10).reshape((2,5))
#reshape中2表示0轴上长度为2,5表示1轴上长度为5.
np.loadtxt(frame,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)
#参数:
示例编写:
import numpy as np
file_path="C:\Program Files\Python38" #文件路径相当于那个frame
a=np.loadtxt(file_path,delimiter=",",dtype="int") #定义参数
print(a)
#这里没有提供相应的文件,只是简单示例编写方法。
#补充一下numpy中转置的三种方法(除了改变unpack):
import numpy as np
a=np.array(range(18)).reshape((3,6))
print(a)
b=a.transpose()
c=a.T
d=a.swapaxes(1,0)
print("*"*100)
print(b)
print("*"*100)
print(c)
print("*"*100)
print(d)
输出:
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]]
****************************************************************************************************
[[ 0 6 12]
[ 1 7 13]
[ 2 8 14]
[ 3 9 15]
[ 4 10 16]
[ 5 11 17]]
****************************************************************************************************
[[ 0 6 12]
[ 1 7 13]
[ 2 8 14]
[ 3 9 15]
[ 4 10 16]
[ 5 11 17]]
****************************************************************************************************
[[ 0 6 12]
[ 1 7 13]
[ 2 8 14]
[ 3 9 15]
[ 4 10 16]
[ 5 11 17]]
注意:numpy中的索引和python中类似,也是从0开始;
直接上代码示例:
import numpy as np
# a=np.array(range(18)).reshape((3,6))
a=np.array([[0,1,2,3],
[4,5,6,7],
[8,9,10,11]])
print(a)
#取一行或多行
print("*"*100)
print(a[1]) #第二行
print("*"*100)
print(a[1:3]) #取连续多行
print("*"*100)
print(a[[0,2]]) #取不连续多行,注意其中有两个【】
#取一列或多列
print("*"*100)
print(a[:,2]) #取第三列;取列的方法在下面会详细介绍;
print("*"*100)
print(a[:,2:4])
#取多行和多列:取的是交叉的点
print("*"*100)
print(a[0:2,1:3])
#取多个不相邻的点
print(a[[1,1],[1,2]]) #取出的是(1,1);(1,2)对应的点??
import numpy as np
# a=np.array(range(18)).reshape((3,6))
a=np.array([[0,1,2,3],
[4,5,6,7],
[8,9,10,11]])
a[:,1:3]=0 #将切片数据赋值为0
print(a)
print("*"*100)
print(a<5) #a中小于5的为true
输出:
[[ 0 0 0 3]
[ 4 0 0 7]
[ 8 0 0 11]]
*******************************************************************************************
[[ True True True True]
[ True True True False]
[False True True False]]
import numpy as np
# a=np.array(range(18)).reshape((3,6))
a=np.array([[0,1,2,3],
[4,5,6,7],
[8,9,10,11]])
a[a<5]=0
print(a)
输出
[[ 0 0 0 0]
[ 0 5 6 7]
[ 8 9 10 11]]
注意:一个是np.where;另一个为a.clip;使用方法不同。
import numpy as np
a=np.arange(24).reshape((4,6))
b=np.where(a<10,0,10) #numpy的三元运算符,将a中小于10的数赋值为0,大于的赋值为10
print(b)
print("*"*80)
c=a.clip(10,18) #裁剪,小于10替换为10,大于18替换为18;
print(c)
输出:
[[ 0 0 0 0 0 0]
[ 0 0 0 0 10 10]
[10 10 10 10 10 10]
[10 10 10 10 10 10]]
********************************************************************************
[[10 10 10 10 10 10]
[10 10 10 10 10 11]
[12 13 14 15 16 17]
[18 18 18 18 18 18]]
注意:nan和inf的数据类型为float;如果想进行数据转换,需要进行先将数据dtype设置为float
import numpy as np
# 两个nan是不相等的
print(np.nan==np.nan)
print(np.nan!=np.nan)
#利用以上特性可以计算出数据中nan的个数
a=np.array([1.,3.,np.nan])
print(np.count_nonzero(a!=a)) #count_nonzero:统计非0的数据的个数
#将判断为nan的数值赋值为0:对数据进行判断:用isnan():统计数据中为nan的个数时用
a[np.isnan(a)]=0
print(a)
输出:
False
True
1
[1. 3. 0.]
nan的处理:在数据分析中如果出现nan时:一般将其所在行删除,或者将nan位置的数值替换为该列的平均值,选择后者一般不影响数据的完整性。因此下一节介绍一些常用的numpy中的统计方法
import numpy as np
a=np.array([[0,1,2,3],
[4,5,6,7],
[8,9,np.nan,10]])
#sum
print(a.sum(axis=0)) #求和列
print(a.sum()) #总求和
#median
print(np.median(a,axis=0)) #求中值
输出:
[12. 15. nan 20.]
nan
[ 4. 5. nan 7.]
import numpy as np
def fill_ndarray(a):
for i in range(a.shape[1]): #遍历每一列
tem_col=a[:,i] #当前列
nan_num=np.count_nonzero(tem_col!=tem_col)
if nan_num !=0: #不为0,说明当前列有nan
tem_not_nan_col=tem_col[tem_col==tem_col] #当前列不为nan的array
#选当前为nan的位置,将不为nan的均值赋值给nan
tem_col[np.isnan(tem_col)]=tem_not_nan_col.mean()
return a
if __name__=="__main__":
a = np.arange(12).reshape((3, 4)).astype("float") #astype将数据类型设置为float
a[1, 2:] = np.nan
print(a)
print("*"*80)
a=fill_ndarray(a)
print(a)
输出:
[[ 0. 1. 2. 3.]
[ 4. 5. nan nan]
[ 8. 9. 10. 11.]]
********************************************************************************
[[ 0. 1. 2. 3.]
[ 4. 5. 6. 7.]
[ 8. 9. 10. 11.]]
import numpy as np
a=np.array([[1,2,3,4],
[5,6,7,8]])
b=np.array([[9,10,11,12],
[13,14,15,16]])
#竖直拼接vstack
print(np.vstack((a,b)))
#水平拼接 hstack
print("*"*80)
print(np.hstack((a,b)))
输出:
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]
[13 14 15 16]]
********************************************************************************
[[ 1 2 3 4 9 10 11 12]
[ 5 6 7 8 13 14 15 16]]
5.2 交换行/列
目的:为了两个数据的数据处理
import numpy as np
a=np.arange(12,24).reshape((3,4))
print(a)
print("*"*80)
#行交换
a[[1,2],:]=a[[2,1],:]
print(a)
print("*"*80)
#列交换
a[:,[0,2]]=a[:,[2,0]]
print(a)
print("*"*80)
#补充:构造全为0/1的数组
b=np.zeros((2,3))
c=np.ones((3,3))
print(b)
print(c)
print("*"*80)
#创建一个全为1的正方形数组eye()
d=np.eye(3)
print(d)
print("*"*80)
#获取最大最小值的位置
print(a)
print(np.argmax(a,axis=0))
print(np.argmin(a,axis=1))
输出:
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]
********************************************************************************
[[12 13 14 15]
[20 21 22 23]
[16 17 18 19]]
********************************************************************************
[[14 13 12 15]
[22 21 20 23]
[18 17 16 19]]
********************************************************************************
[[0. 0. 0.]
[0. 0. 0.]]
[[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]
********************************************************************************
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
********************************************************************************
[[14 13 12 15]
[22 21 20 23]
[18 17 16 19]]
[1 1 1 1]
[2 2 2]