1.为什么要使用Numpy?
下面用一个小小的例子来说明下,比如现在有两个列表,每个列表内的元素个数相同,现在要求两个列表中的每个元素一一对应相乘进行运算,把计算结果放到新列表中
常规写法
#现在2两个列表,且每个列表元素个数相同,要求两个列表内的每个元素一一对应进行相乘运算,并把所有结果放到一个新的列表3中
list_1 = [1,2,3,4,5]
list_2 = [1,2,3,4,5]
list_3 = []
#取列表长度作为for循环次数
for x in range(len(list_1)):
res = list_1[x]*list_2[x]
list_3.append(res)
print(list_3) #输出结果[1, 4, 9, 16, 25]
使用Numpy写法
#导入numpy这个包并起别名np,方便写
import numpy as np
#创建2个数组
arr_1 = np.arange(10) #输出结果[0 1 2 3 4 5 6 7 8 9]
arr_2 = np.arange(10) #输出结果[0 1 2 3 4 5 6 7 8 9]
#两个数组直接进行计算并把结果给数组3
arr_3 = arr_1*arr_2
#输入结果
print(arr_3) #输出结果[ 0 1 4 9 16 25 36 49 64 81]
从上面这个小小的例子就可以看出来了,是很方便的,当然,Numpy不止这些,还有其他很多方便的地方
2.Numpy中的数组属性
在Numpy中所有的数组都为对象ndarray,大致属性为一下几种
ndarray.ndim 返回数组对象的维度的个数,数组的维度数量被称为rank
ndarray.shape 返回一个元组,表示每个维度中数组的大小
ndarray.dtype 返回数组对象的数据类型
ndarray.size 返回数组的所有数据个数,相等于shape的元素的乘积
ndarray.itemsize 返回数组中每个数据的字节长度
3.创建数组的几种方法
1>第一种,可以把python中的列表转换为数组
#创建一维数组
#创建python中的普通列表
list_1 = [1,2,3,4,5]
#使用np(numpy)中的array来转换
arr_1 = np.array(list_1)
print(arr_1) #输出结果[1 2 3 4 5]
#创建二维数组
#创建两个python中普通列表
list_2 = [1,2,3]
list_3 = [4,5,6]
#使用array转换
arr_2 = np.array([list_2,list_3])
print(arr_2) #输入结果[[1 2 3][4 5 6]]
2>第二种,使用numpy.arange()创建
#使用numpy.arange()创建一个一维数组
arr = np.arange(5)
print(arr) #输出结果[0 1 2 3 4]
3>第三种,使用numpy.random.rand()创建一个指定维度数的随机数组
#numpy.random.rand(d1,d2,d3,d4,d5,d6...dn) n维数组
#创建一个一维数组
arr = np.random.rand(1)
print(arr) #输出结果[ 0.07781411]
#创建一个二维数组
arr = np.random.rand(2,2)
print(arr) #输出结果[[ 0.04608068 0.63958486][ 0.6734346 0.37702904]]
#创建一个三维数组
arr = np.random.rand(1,1,1)
print(arr) #输出结果[[[ 0.25641335]]]
4>第四种,使用zeros()函数创建数组,数据都是以0开头
参数1shape:空数组的形状,整数或整数元祖
参数2dtype:数组数据类型
参数3order: 'C'为按行的 C 风格数组,'F'为按列的 Fortran 风格数组
#使用zeros()函数创建
arr = np.zeros(5)
print(arr) #输出结果[ 0. 0. 0. 0. 0.]
arr = np.zeros((2,2))
print(arr) #输出结果[[ 0. 0.][ 0. 0.]]
#没有指定数据类型默认都为float
arr = np.zeros((2,2),dtype=int) #指定数据类型后,现在类型为int
print(arr) #输出结果[[0 0][0 0]]
5>第五种,使用ones()函数创建数组,数据都是以1开头
参数1shape:空数组的形状,整数或整数元祖
参数2dtype:数组数据类型
参数3order: 'C'为按行的 C 风格数组,'F'为按列的 Fortran 风格数组
#使用ones()函数创建
arr = np.ones(5)
print(arr) #输出结果[ 1. 1. 1. 1. 1.]
arr = np.ones((2,2))
print(arr) #输出结果[[ 1. 1.][ 1. 1.]]
#没有指定数据类型默认都为float
arr = np.ones((2,2),dtype=int)
print(arr) #输出结果[[1 1][1 1]]
6>第六种,使用empty()函数来创建数组
参数1shape:空数组的形状,整数或整数元祖
参数2dtype:数组数据类型
参数3order: 'C'为按行的 C 风格数组,'F'为按列的 Fortran 风格数组
#使用empty()函数来创建数组
arr = np.empty(5)
print(arr) #输出结果[ 1. 1. 1. 1. 1.]
arr = np.empty((2,2))
print(arr) #输出结果[[ 1. 1.][ 1. 1.]]
arr = np.empty((2,2),dtype=int)
print(arr) #输出结果[[0 1][2 3]]
因为数组的元素没有初始化,所以为随机值
empty和zeros不一样,不会将数组值设置为0,因此可能会快一点,另一方面,它要求用户手动设置数组中的所有值,并且应谨慎使用。
7>第七种,使用identity()函数创建对角线为1的数据
#使用identity()创建对角线为1的数组
arr = np.identity(5,dtype=int)
print(arr)
#输出结果
#[[1 0 0 0 0]
# [0 1 0 0 0]
# [0 0 1 0 0]
# [0 0 0 1 0]
# [0 0 0 0 1]]
4.数组的数据类型指定与数据类型转换
1>指定数组的数据类型
#指定数组数据的数据类型
#创建数组,指定数据类型为int
arr = np.zeros((3,3),dtype=int)
print(arr) #输出结果[[0 0 0][0 0 0][0 0 0]]
print(arr.dtype) #输出结果int32
2>使用astype转换数组的数据类型
#使用astype()函数转换数据类型
#创建一个数组,类型为float
arr = np.array([[1.5,1.6],[1.55,1.25],[1.96,1.88]])
print(arr) #输出结果[[ 1.5 1.6 ][ 1.55 1.25][ 1.96 1.88]]
print(arr.dtype) #输出结果float64
#使用astype()转换
arr_int = arr.astype(np.int)
print(arr_int) #输出结果[[1 1][1 1][1 1]]
print(arr_int.dtype) #输出结果int32
主要:转换为int型,只保留整数部分
5.数组与数组之间的计算
# 数组的运算
arr = np.array([[1,2,3],[4,5,6]])
arr2 = np.array([[4,5,6],[7,8,9]])
# 乘法运算 会把运算作用数组中的每一个元素中
print('乘法运算',arr*3) #输出结果[[ 3 6 9][12 15 18]]
# 乘方
print('乘方运算',arr**2) #输出结果[[ 1 4 9][16 25 36]]
# 矩阵(数组)加减乘除运算
print(arr+arr2) #输出结果[[ 5 7 9][11 13 15]]
print(arr-arr2) #输出结果[[-3 -3 -3][-3 -3 -3]]
print(arr/arr2) #输出结果[[ 0.25 0.4 0.5 ][ 0.57142857 0.625 0.66666667]]
print(arr*arr2) #输出结果[[ 4 10 18][28 40 54]]
6.数组的条件索引
#单个条件
#创建一个数组
arr_1 = np.arange(10)
print(arr_1) #输出结果[0 1 2 3 4 5 6 7 8 9]
arr_is_ok = arr_1>=5 #以此判断arr_1中的数据>=5,并把布尔结果放在新数组
print(arr_is_ok) #输出结果[False False False False False True True True True True]
#筛选出所有大于等于5的数组放在arr_2中
arr_2 = arr_1[arr_is_ok]
print(arr_2) #输出结果[5 6 7 8 9]
#多个条件,并且每个条件都同时成立,每个条件用括号括起来
arr_is_ok = (arr_1>=5)&(arr_1%2==0)
print(arr_is_ok) #输出结果[False False False False False False True False True False]
#筛选出所有为True的数据
arr_2 = arr_1[arr_is_ok]
print(arr_2) #输出结果[6 8]
#多个条件,只要有一个条件成立即可
arr_is_ok = (arr_1>=5)|(arr_1%2==0)
print(arr_is_ok) #输出结果[ True False True False True True True True True True]
#筛选出所有为True的数据
arr_2 = arr_1[arr_is_ok]
print(arr_2) #输出结果[0 2 4 5 6 7 8 9]
7.数组的切片
#数组的切片,依然从索引0开始
#一维数组切片
arr = np.arange(10)
print(arr) #输出结果[0 1 2 3 4 5 6 7 8 9]
print(arr[2:5]) #输出结果[2 3 4]
print(arr[:5]) #输出结果[0 1 2 3 4]
print(arr[5:]) #输出结果[5 6 7 8 9]
print(arr[2::2]) #输出结果[2 4 6 8]
#二维数组切片
arr = np.array([[1,2,3,4,5],[6,7,8,9,10]])
print(arr) #输出结果[[ 1 2 3 4 5][ 6 7 8 9 10]]
#取出4的值
print(arr[0][3])
#取出10的值
print(arr[1][4])
8.使用reshape()函数转换数组维数,一维转多维,多维转一维
转换后的数组数据个数必须等于转换之前一维数组的数据个数
#使用reshape()函数将一维数组转换为多维数组
#声明一个一维数组
arr = np.arange(10)
print(arr) #输出结果[0 1 2 3 4 5 6 7 8 9]
#使用reshape()转换
new_arr = arr.reshape(2,5)
print(new_arr) #输出结果[[0 1 2 3 4][5 6 7 8 9]]
new_arr = arr.reshape(5,2)
print(new_arr) #输出结果[[0 1][2 3][4 5][6 7][8 9]]
#使用reshape()函数将多维数组转换为一维数组
arr = new_arr.reshape(10)
print(arr) #输出结果[0 1 2 3 4 5 6 7 8 9]
9.数组的转置,使用transpose()函数
#数组的转置
arr_1 = np.random.rand(2,5)
print(arr_1) #输出结果[[ 0.23108528 0.71822154 0.48542061 0.86062775 0.93285996][ 0.93597528 0.82592221 0.28738888 0.923042 0.15797056]]
print(arr_1.ndim) #输出结果2
print(arr_1.shape) #输出结果(2,5)
#使用transpose()函数转置
arr_2 = arr_1.transpose()
print(arr_2)
print(arr_2.ndim) #输出结果2
print(arr_2.shape) #输出结果(5, 2)
10.Numpy中的函数
1>通用函数
(1)ceil()函数--->向上取整
#随机生成一个多维数组
arr = np.random.rand(2,3)
print(arr) #输出结果[[ 0.93034735 0.473756 0.69833583][ 0.82455146 0.33916689 0.15263583]]
#使用celi()函数向上取整
arr = np.ceil(arr)
print(arr) #输出结果[[ 1. 1. 1.][ 1. 1. 1.]]
(2)floor()函数--->向下取整
#随机生成一个多维数组
arr = np.random.rand(2,3)
print(arr) #输出结果[[ 0.93034735 0.473756 0.69833583][ 0.82455146 0.33916689 0.15263583]]
#使用celi()函数向上取整
arr = np.floor(arr)
print(arr) #输出结果[[ 0. 0. 0.][ 0. 0. 0.]]
(3)rint()函数--->四舍五入
#随机生成一个多维数组
arr = np.random.rand(2,3)
print(arr) #输出结果[[ 0.93034735 0.473756 0.69833583][ 0.82455146 0.33916689 0.15263583]]
#使用celi()函数向上取整
arr = np.rint(arr)
print(arr) #输出结果[[ 1. 0. 1.][ 1. 1. 0.]]
(4)isnan()函数--->判断数组数据是否为空
#随机生成一个多维数组
arr = np.random.rand(2,3)
print(arr) #输出结果[[ 0.93034735 0.473756 0.69833583][ 0.82455146 0.33916689 0.15263583]]
#使用celi()函数向上取整
arr = np.isnan(arr)
print(arr) #输出结果[[False False False][False False False]]
(5)multiply()函数--->相乘函数
#创建2个数组
arr_1 = np.array([[1,2,3,4],[5,6,7,8]])
arr_2 = np.array([[1,2,3,4],[5,6,7,8]])
arr_3 = np.multiply(arr_1,arr_2)
print(arr_3) #输出结果[[ 1 4 9 16][25 36 49 64]]
(6)divide()函数--->相除函数#创建2个数组
arr_1 = np.array([[1,2,3,4],[5,6,7,8]])
arr_2 = np.array([[1,2,3,4],[5,6,7,8]])
arr_3 = np.divide(arr_1,arr_2)
print(arr_3) #输出结果[[ 1. 1. 1. 1.][ 1. 1. 1. 1.]]
2>统计函数
(1)sum()--->相加函数
#随便创建一个数组
arr = np.arange(10).reshape(2,5)
print(arr) #输出结果[[0 1 2 3 4][5 6 7 8 9]]
print(np.sum(arr)) #输出结果45
(2)mean()--->平均数
#随便创建一个数组
arr = np.arange(10).reshape(2,5)
print(arr) #输出结果[[0 1 2 3 4][5 6 7 8 9]]
print(np.mean(arr)) #输出结果4.5
(3)max()--->最大值#随便创建一个数组
arr = np.arange(10).reshape(2,5)
print(arr) #输出结果[[0 1 2 3 4][5 6 7 8 9]]
print(np.max(arr)) #输出结果9
(4)min()--->最小值
#随便创建一个数组
arr = np.arange(10).reshape(2,5)
print(arr) #输出结果[[0 1 2 3 4][5 6 7 8 9]]
print(np.min(arr)) #输出结果0
(5)var()--->计算方差
#随便创建一个数组
arr = np.arange(10).reshape(2,5)
print(arr) #输出结果[[0 1 2 3 4][5 6 7 8 9]]
print(np.var(arr)) #输出结果8.25
(6)std()--->计算标准差
#随便创建一个数组
arr = np.arange(10).reshape(2,5)
print(arr) #输出结果[[0 1 2 3 4][5 6 7 8 9]]
print(np.std(arr)) #输出结果2.87228132327
(7)argmax()--->最大值索引
#随便创建一个数组
arr = np.arange(10).reshape(2,5)
print(arr) #输出结果[[0 1 2 3 4][5 6 7 8 9]]
print(np.argmax(arr)) #输出结果9
(8)argmin()--->最小值索引
#随便创建一个数组
arr = np.arange(10).reshape(2,5)
print(arr) #输出结果[[0 1 2 3 4][5 6 7 8 9]]
print(np.argmin(arr)) #输出结果0
(9)cumsum()--->累加计算
#随便创建一个数组
arr = np.arange(10).reshape(2,5)
print(arr) #输出结果[[0 1 2 3 4][5 6 7 8 9]]
print(np.cumsum(arr)) #输出结果[ 0 1 3 6 10 15 21 28 36 45]
(10)cumprod()--->累乘计算
#随便创建一个数组
arr = np.arange(10).reshape(2,5)
print(arr) #输出结果[[0 1 2 3 4][5 6 7 8 9]]
print(np.cumprod(arr)) #输出结果[0 0 0 0 0 0 0 0 0 0]
3>条件函数
1>where()函数
#随便创建一个数组
arr = np.arange(10).reshape(2,5)
print(arr) #输出结果[[0 1 2 3 4][5 6 7 8 9]]
arr = np.where(arr>=5,True,False)
print(arr) #输出结果[[False False False False False][ True True True True True]]
2>any()函数
#随便创建一个数组
arr = np.arange(10).reshape(2,5)
print(arr) #输出结果[[0 1 2 3 4][5 6 7 8 9]]
arr = np.any(arr>=5)
##表示数组中至少有一个符号条件的元素,返回True,否则返回False
print(arr) #输出结果
3>all()函数
#随便创建一个数组
arr = np.arange(10).reshape(2,5)
print(arr) #输出结果[[0 1 2 3 4][5 6 7 8 9]]
arr = np.all(arr>=5)
#表示数组中的元素必须全部符合条件,返回True,否则返回False
print(arr) #输出结果False
4>unique()函数#随便创建一个数组
arr_1 = np.array([[1,3,4,5,6],[2,3,4,6,9]])
arr = np.unique(arr_1)
#返回数组中的唯一值,返回一个排好序的一维数组
print(arr) #输出结果[1 2 3 4 5 6 9]