numpy是一个在python中做科学计算的基础库,重在数值计算,多用于在大型、多维数组上执行数值计算,使用起来非常快速方便。
目录
numpy创建数组(array矩阵)
数据的类型dtype
修改数组的数据类型astype
数组的形状shape
数组的计算
数组的广播机制
读取本地数据
numpy索引和切片
取行
取列
取某行某列的值
取多行多列的值(行和列交叉位置的值)
取多个不相邻的点
numpy中数值的高级修改(条件修改)
单一条件修改
多条件修改(三元运算符)
clip裁剪
数组的拼接
其他方法工具
numpy中的nan和inf
nan的注意点
numpy中常用的统计函数
使用numpy首先要在开始import入numpy包,并起别名为np(方便后面使用)
import numpy as np
#使用numpy生成数组,得到ndarray的类型
t1 = np.array([1,2,3])
print(t1) #[1 2 3]
print(type(t1)) #
t2 = np.array(range(10))
print(t2) #[0 1 2 3 4 5 6 7 8 9]
t3 = np.arange(10)
print(t3) #[0 1 2 3 4 5 6 7 8 9]
print(t3.dtype) #int64
注意np.arrange的用法:arrange( [ start , ] stop [ , step] , dtype = None )
采用默认时生成的数组数据类型与系统的位数有关(一般为int64 或 int32等)
#创建numpy中指定的数据类型
t4 = np.array(range(1,4),dtype=float) 或使用dtype=" ? "
print(t4) #[ 1. 2. 3.]
print(t4.dtype) #float64
使用数据类型代码时要记得加引号
t4 = np.array(range(1,4),dtype="i1")
print(t4) #[1 2 3]
print(t4.dtype) #int8
t5 = np.array([1,1,0,1],dtype=bool)
print(t4) #[ True True False True]
print(t4.dtype) #bool
#调整数据类型
t6 = t5.astype("int8")
print(t6.dtype) #int8
np.round(t5,2) 使用round保留浮点数的小数位数
#一维数组
t1 = np.arange(10)
print(t1) #[0,1,2,3,4,5,6,7,8,9]
print(t1.shape) #(10,)
#二维数组
t2 = np.array([[1,2,3],[4,5,6]])
print(t2)
'''
[[1 2 3]
[4 5 6]]
'''
print(t2.shape) #(2,3)
#三维数组
t3 = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
print(t3)
'''
[[[ 1 2 3]
[ 4 5 6]]
[[ 7 8 9]
[10 11 12]]]
'''
print(t3.shape) #(2, 2, 3)
一维数组的shape为(数量)
二维数组的shape为(行数,列数)
三维数组的shape为(块数,行数,列数)
可以使用 t3 = t3.reshape(12,) 对数组的形状进行新的表示
如果不知道该数组的数量,可以使用 t3 = t3.reshape((t3.shape[0]*t3.shape[1],))将二维数组修改为一维数组
但其实使用t3 = t3.reshape(-1) 或 t3 = t3.flatten()即可展开
数组的加减乘除对数组内的每一个值都进行
广播原则:如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符或其中一方的长度为1,则认为它们是广播兼容的。广播会在缺失和(或)长度为1的维度上进行。
轴(axis):行和列分别对应0轴和1轴
常见的小型数据文件格式 CSV:Comma-Separated Value,逗号分隔值文件,每一行的数据表示一条记录
np.loadtxt(frame,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=Flase)
unpack = True时是将读入的数据进行转置,与t3.transpose()、t3.T、t3.swapaxes(1,0)功能相同
t1 = np.arange(100).reshape(10,10)
'''
0 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49
50 51 52 53 54 55 56 57 58 59
60 61 62 63 64 65 66 67 68 69
70 71 72 73 74 75 76 77 78 79
80 81 82 83 84 85 86 87 88 89
90 91 92 93 94 95 96 97 98 99
'''
#取行
print(t1[1]) # [10 11 12 13 14 15 16 17 18 19]
#取连续的多行
print(t1[7:])
'''
[[70 71 72 73 74 75 76 77 78 79]
[80 81 82 83 84 85 86 87 88 89]
[90 91 92 93 94 95 96 97 98 99]]
'''
#取不连续的多行
print(t1[[0,3,7]])
'''
[[ 0 1 2 3 4 5 6 7 8 9]
[30 31 32 33 34 35 36 37 38 39]
[70 71 72 73 74 75 76 77 78 79]]
'''
#取列
print(t1[:,0]) # [ 0 10 20 30 40 50 60 70 80 90]
#取连续多列
print(t1[:,:2])
'''
[[ 0 1]
[10 11]
[20 21]
[30 31]
[40 41]
[50 51]
[60 61]
[70 71]
[80 81]
[90 91]]
'''
#取不连续多列
print(t1[:,[0,3,5]])
'''
[[ 0 3 5]
[10 13 15]
[20 23 25]
[30 33 35]
[40 43 45]
[50 53 55]
[60 63 65]
[70 73 75]
[80 83 85]
[90 93 95]]
'''
# 取第2行第2列的值
a = t1[1,1]
print(a) # 11
print(type(a)) #
# 取第2-4行,5-7列的结果
print(t1[1:4,4:7])
'''
[[14 15 16]
[24 25 26]
[34 35 36]]
'''
#选出来的结果是 (0,0) (3,0)
print(t1[[0,3],[0,0]]) #[ 0 30]
#选出来的结果是 (0,0) (2,1) (2,3)
print(t1[[0,2,2],[0,1,3]]) #[ 0 21 23]
1.可以直接对某些位置的内容进行赋值修改
2.条件修改
a = t1<25
print(a)
'''
[[ True True True True True True True True True True]
[ True True True True True True True True True True]
[ True True True True True False False False False False]
[False False False False False False False False False False]
[False False False False False False False False False False]
[False False False False False False False False False False]
[False False False False False False False False False False]
[False False False False False False False False False False]
[False False False False False False False False False False]
[False False False False False False False False False False]]
'''
print(a.dtype) # bool
t1[t1<25] = 0
print(t1)
'''
[[ 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 25 26 27 28 29]
[30 31 32 33 34 35 36 37 38 39]
[40 41 42 43 44 45 46 47 48 49]
[50 51 52 53 54 55 56 57 58 59]
[60 61 62 63 64 65 66 67 68 69]
[70 71 72 73 74 75 76 77 78 79]
[80 81 82 83 84 85 86 87 88 89]
[90 91 92 93 94 95 96 97 98 99]]
'''
print(np.where(t1<50,0,100))
'''
[[ 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0]
[100 100 100 100 100 100 100 100 100 100]
[100 100 100 100 100 100 100 100 100 100]
[100 100 100 100 100 100 100 100 100 100]
[100 100 100 100 100 100 100 100 100 100]
[100 100 100 100 100 100 100 100 100 100]]
'''
# 将小于35的修改为35,大于90的修改为90
print(t1.clip(35,90))
'''
[[35 35 35 35 35 35 35 35 35 35]
[35 35 35 35 35 35 35 35 35 35]
[35 35 35 35 35 35 35 35 35 35]
[35 35 35 35 35 35 36 37 38 39]
[40 41 42 43 44 45 46 47 48 49]
[50 51 52 53 54 55 56 57 58 59]
[60 61 62 63 64 65 66 67 68 69]
[70 71 72 73 74 75 76 77 78 79]
[80 81 82 83 84 85 86 87 88 89]
[90 90 90 90 90 90 90 90 90 90]]
'''
np.vstack 竖直拼接(vertically)
np.hstack 水平拼接(horizontally)
行列交换:
# 行交换
t1[[1:2],:] = t1[[2:1],:]
# 列交换
t1[:,[0:2]] = t1[:,[2:0]]
1.获取最大值最小值的位置:
2.创建一个全为0的数组:np.zeros()
3.创建一个全为1的数组:np.ones()
4.创建一个对角线为1的正方形数组(方阵):np.eye()
5.生成随机数
nan(NAN,Nan) :not a number表示不是一个数字
inf(-inf,inf):infinity无穷大,inf表示正无穷,-inf表示负无穷
1.两个nan是不相等的
print(np.nan == np.nan) #False
print(np.nan != np.nan) #True
2.利用以上特性,可以判断数组中nan的个数 np.count_nonzero(t1 != t1)或np.isnan(t1)
3.nan和任何值计算都为nan