【python实用派---第四章 python进阶之numpy库】

本文详细介绍了Python编程的基础内容,包括Numpy库的数组操作、数学函数、统计信息,以及Pandas库的使用。通过numpy的ndarray和vectorization,提升数据处理效率。后续章节深入探讨了numpy的where函数、数组连接方法,并结合实际求解器应用。适合数据分析新手和进阶者学习。

python实用派

第一章 python是什么?初始化
第二章 python基础内容(1)
第三章 python基础内容(2)
第四章 python进阶之numpy库
第五章 python进阶之pandas库
第六章 python进阶之求解器应用–gurobi求解器
第七章 python进阶之求解器应用–cplex求解器
第八章 python进阶之数据可视化篇
第九章 python进阶之爬虫篇



推荐一些网站
Python数据分析
菜鸟教程
优快云
博客园
知乎
幻海

一. 初识Numpy

Numerical Python的简称,

  • 学习原因:
  1. 数据矢量化,操作、运算、高效处理大数组数据
  2. 基于NumPy的算法要⽐纯Python快10到100倍(甚⾄更快),并且使⽤的内存更少
  3. 实现绘图等功能时,numpy数组更方便进行操作

NumPy本身并没有提供多么⾼级的数据分析功能,理解NumPy数组以及⾯向数组的计算将有助于你更加⾼效地使⽤诸如pandas之类的⼯具。
首先,安装numpy包,可通过以下cmd命令

pip install numpy

亦可通过pycharm简单直接安装。

1. ndarray

NumPy最重要的⼀个特点就是其N维数组对象ndarray,最简单常用的是用来存放向量或矩阵。
在numpy中,可以通过array来创建ndarray对象。

import numpy as np 
a = np.array([1,2,3])  
print (a)
b = np.array([1,2,3], [4,5,6])
#输出结果:
[1 2 3] # 一维数组
[[1 2 3]
 [4 5 6]]  # 二维数组,或者说是矩阵

可以从输出结果中看出,ab是ndarray对象。
numpy 支持的数据类型比 Python 内置的类型要多很多,包括但不限于整数,浮点数,复数等类型

2. numpy数组属性

数组或者说矩阵有很多的属性,通过numpy的属性调用可以很方便的进行查看。包括秩、维度等信息。

ndarray.ndim	秩,即轴的数量或维度的数量
ndarray.shape	数组的维度,对于矩阵,n 行 m 列
ndarray.size	数组元素的总个数,相当于 .shape 中 n*m 的值
ndarray.dtype	ndarray 对象的元素类型
ndarray.itemsize	ndarray 对象中每个元素的大小,以字节为单位
......

例如

a = np.array([[1,2,1],[3,2,1],[4,5,2],[7,4,2]])
print(a.ndim,a.shape,a.size)
#输出结果:
2 (4, 3) 12

二. numpy数组操作

1. 创建数组

  1. 最简单普遍的方法,将一个列表转为ndarray
data1 = [1,2,54,1,3]
arr1 = np.array(data1, dtype = float, order = 'C')
data2 = [[1,2.2,3], [3,2.3,4], [3,5,6]]
arr2 = np.array(data2, dtype = float, order = 'C')
print(arr1,'\n',arr2)
#输出结果:
[ 1.  2. 54.  1.  3.] 
 [[1.  2.2 3. ]
 [3.  2.3 4. ]
 [3.  5.  6. ]]
  1. np.empty() 方法用来创建一个指定形状(shape)、数据类型(dtype)
np.empty(shape, dtype = float, order = 'C')

arr1 = np.empty(4)
print(arr1)
#输出结果:
[9.38059353e-312 9.38055361e-312 9.38059353e-312 9.38055455e-312] # 一组垃圾值
  1. np.zeros() 方法,创建指定大小的数组,数组元素以 0 来填充:
np.zeros(shape, dtype = float, order = 'C')
arr1 = np.zeros((5,3))
print(arr1)
#输出结果:
[[0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]] # 5行3列的零阵
  1. np.ones()方法,创建指定形状的数组,数组元素以 1 来填充:
np.ones(shape, dtype = None, order = 'C')
arr1 = np.ones((3,3))
print(arr1)
#输出结果:
[[1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]]
  1. 从数值范围创建数组,arange 函数
np.arange(start, stop, step, dtype)

arr1 = np.arange(10)
print(arr1)
#输出结果:
[0 1 2 3 4 5 6 7 8 9]
  1. 创建随机数组
np.random.seed(10)

随机种子问题,在numpy中生成的随机数会根据随机种子的变化进行变化,也就是说其实相同随机种子生成随机数是相同的。
即numpy生成的随机数是伪随机数。

  • 生成均匀分布的随机数
np.random.rand()  0.01.0的随机数
1. 当函数括号内没有参数时,则返回一个浮点数;
2. 当函数括号内有一个参数时,则返回秩为1的数组,不能表示向量和矩阵;
3. 当函数括号内有两个及以上参数时,则返回对应维度的数组,能表示向量或矩阵;

np.random.randint(low,high,size,dtype) 任意值范围的整数
参数包括下限上限和维度大小
如:
arr1 = np.random.rand(5)
print(arr1)
arr2 = np.random.randint(2,10,(2,3))
print(arr2)
#输出结果:
[0.85364799 0.52408892 0.39656741 0.01404099 0.694457  ]
[[8 4 5]
 [8 7 4]]
  • 生成正态分布的随机数
np.random.randn(): 生成符合标准正态分布的随机值,参数与rand一样

np.random.normal(loc,scale,size): 任意平均和标准差的正态分布
例如:
arr1 = np.random.randn(2,3)
print(arr1)
arr2 = np.random.normal(2,3,(2,3))
print(arr2)
#输出结果:
[[ 0.26625833  2.27958012 -0.64669878]
 [-0.01635724  0.12323795 -0.57266114]]
[[ 2.24149188  1.13420682 -0.98789745]
 [ 2.0806294   4.9890554   1.74845624]]
  • 生成0~1之间均匀分布的随机数组
np.random.random(size)
例如:
arr1 = np.random.random(2,3)
print(arr1)
# 输出结果:
[[0.35176817 0.15739158 0.14806865]
 [0.64514549 0.96350656 0.74906913]]
  • 生成二项式的随机数
np.random.binomial(n,p,size)
n个样本,每个样本为1的概率为p

arr1 = np.random.binomial(6,0.3,(3,3))
print(arr1)
#输出结果:
[[0 3 3]
 [3 2 3]
 [3 3 3]]

在这里插入一个函数,用于打乱数组中元素

np.random.shuffle(array)
  • ……

2. 操作数组

首先搞清楚一个概念
二维数组中,轴01

  1. 索引
    在索引数组时,与列表的索引有相似之处
    主要有如下两种方式
arr1 = np.array([[0,1,2],[2,3,5],[8,9,7]])
a = arr1[1][1:]
b = arr1[1,1:]
print(a)
print(b)
#输出结果:
arr1 = np.array([[0,1,2],[2,3,5],[8,9,7]])
a = arr1[1][1:]
b = arr1[1,1:]
print(a)
print(b)

当只传入一个索引时表示根据行进行索引

  • 此外还有布尔型索引,如下:
names =	np.array(['Bob', 'Joe',	'Will',	'Bob', 'Will', 'Joe', 'Joe'])
data = np.random.random((7,3))
print(data)
print(data[names=='Bob'])
#输出结果:
data
[[0.45883304 0.40009091 0.04369823]
 [0.65280035 0.13590858 0.22567336]
 [0.70409829 0.62968559 0.62654572]
 [0.70934663 0.35361712 0.04988245]
 [0.71362283 0.30990566 0.36194346]
 [0.67490236 0.44211051 0.01873732]
 [0.13475554 0.79391254 0.56470123]]
data[names=='Bob']
[[0.45883304 0.40009091 0.04369823]
 [0.70934663 0.35361712 0.04988245]]
  • 花式索引
arr = np.array([[1,1.1,1.111],[2,2.2,2.22],[3,3.3,3.33]])
print(arr[[2,0]])
print(arr[:,[2,0]])
#输出结果:
arr[[2,0]]:
[[3.    3.3   3.33 ]
 [1.    1.1   1.111]]
arr[:,[2,0]]:
[[1.111 1.   ]
 [2.22  2.   ]
 [3.33  3.   ]]
  1. 重塑数组
  • reshape方法
array.reshape(arr, newshape, order='C') # array表示一个数组

arr1 = np.arange(12)
arr2 = arr1.reshape(3,4)
arr3 = arr1.reshape(2,6)
print(arr1)
print(arr2)
print(arr3)
# 输出结果:
arr1
[ 0  1  2  3  4  5  6  7  8  9 10 11]
arr2
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
arr3
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]]
  • 转置
array.T

arr1 = np.arange(12)
arr2 = arr1.reshape(3,4)
arr3 = arr2.T
print(arr2)
print(arr3)
# 输出结果:
arr2
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
arr3
[[ 0  4  8]
 [ 1  5  9]
 [ 2  6 10]
 [ 3  7 11]]
  • 满秩方阵求逆
np.linalg.inv()

arr1 = np.array([[1,2],[3,4]])
invA = np.linalg.inv(arr1)
print(invA)
# 输出结果:
[[-2.   1. ]
 [ 1.5 -0.5]]
  • 方阵求行列式值
np.linalg.det(array)

arr1 = np.array([[1,2],[3,4]])
invA = np.linalg.det(arr1)
print(invA)
# 输出结果:
-2.0
  • 展平数组,即压缩为一维数组
array.ravel(order='C')# 'C' -- 按行,'F' -- 按列,'A' -- 原顺序,'K' -- 元素在内存中的出现顺序。

arr1 = np.arange(12)
arr2 = arr1.reshape(3,4)
arr3 = arr2.ravel(order='C')
arr4 = arr2.ravel(order='F')
print(arr2)
print(arr3)
print(arr4)
#输出结果:
arr2:
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
arr3:
[ 0  1  2  3  4  5  6  7  8  9 10 11]
arr4:
[ 0  4  8  1  5  9  2  6 10  3  7 11]

3. 数学函数

广播式运算
如果两个数组 a 和 b 形状相同,那么 a(加减乘除)b 的结果就是 a 与 b 数组对应位运算。这要求维数相同,且各维度的长度相同。
当运算中的 2 个数组的形状不同时,numpy 将自动触发广播机制

  • 加减乘除(按位运算,对应位置进行计算)
arr1 = np.array([[1,2,3],[4,5,6],[7,8,9]])
arr2 = np.array([[1,1,1],[2,2,2],[3,3,3]])
print(arr1+arr2)
[[ 2  3  4]
 [ 6  7  8]
 [10 11 12]]
print(arr1-arr2)
[[0 1 2]
 [2 3 4]
 [4 5 6]]
print(arr1*arr2)
[[ 1  2  3]
 [ 8 10 12]
 [21 24 27]]
print(arr1/arr2)
[[1.         2.         3.        ]
 [2.         2.5        3.        ]
 [2.33333333 2.66666667 3.        ]]

当运算中的 2 个数组的形状不同时 广播

arr1 = np.array([[1,2,3],[4,5,6],[7,8,9]])
arr2 = np.array([1,1,1])
print(arr1+arr2)
[[ 2  3  4]
 [ 5  6  7]
 [ 8  9 10]]
print(arr1-arr2)
[[0 1 2]
 [3 4 5]
 [6 7 8]]
print(arr1*arr2)
[[1 2 3]
 [4 5 6]
 [7 8 9]]
print(arr1/arr2)
[[1. 2. 3.]
 [4. 5. 6.]
 [7. 8. 9.]]
  • 矩阵运算
    矩阵乘法np.dot()
arr1 = np.array([[1,2,3],
				 [4,5,6],
				 [7,8,9]])
arr2 = np.array([[1,1,1],
				 [2,2,2],
				 [3,3,3]])
arr3 = np.dot(arr1,arr2)
print(arr3)
[[14 14 14]
 [32 32 32]
 [50 50 50]]
  • 三角函数
    np.sin(array)
    np.cos(array)
    np.tan(array)

  • 其他一些函数
    np.sqrt(a) 对每个元素开方
    np.abs(a) 对每个元素取绝对值

4. 数组统计信息

axis=0表示沿着行轴方向,axis=0表示沿着列轴方向

函数代码
求和array.sum(axis) axis=0为行,1为列,空为全部
求平均array.mean(axis) axis=0为行,1为列,空为全部
最大值array.max(axis) axis=0为行,1为列,空为全部
最小值array.min(axis) axis=0为行,1为列,空为全部
最大值所在索引array.argmax(axis) axis=0为行,1为列,空为全部
最小值所在索引array.argmin(axis) axis=0为行,1为列,空为全部
标准差array.std(axis) axis=0为行,1为列,空为全部
方差array.var(axis) axis=0为行,1为列,空为全部
所有元素的累计积array.cumprod(axis) axis=0为行,1为列,空为全部
所有元素的累计和array.cumsum(axis) axis=0为行,1为列,空为全部

三. 进阶操作

1. numpy.where()

numpy.where() 函数返回输入数组中满足给定条件的元素的索引。

arr1 = np.array([[1,2,3],
				 [4,5,6],
				 [7,8,9]])
pos = np.where(arr1>5)
print(pos)
print(arr1[pos])
#输出结果:
(array([1, 2, 2, 2], dtype=int64), array([2, 0, 1, 2], dtype=int64))

[6 7 8 9]

2. 连接数组

函数说明
np.concatenate((array1,array2,…),axis)连接沿现有轴的数组序列
np.stack((array1,array2,…),axis)沿着新的轴加入一系列数组。
np.hstack((array1,array2,…))水平堆叠序列中的数组(列方向)
np.vstack((array1,array2,…))竖直堆叠序列中的数组(行方向)
arr1 = np.array([[1,2,3],
				 [4,5,6],
				 [7,8,9]])
arr2 = np.array([[10,11,12],
				 [13,14,15],
				 [16,17,18]])
arr3 = np.concatenate((arr1,arr2), axis=0)
arr4 = np.concatenate((arr1,arr2), axis=1)
print(arr3)
print(arr4)
#输出结果:
[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]
 [13 14 15]
 [16 17 18]]
[[ 1  2  3 10 11 12]
 [ 4  5  6 13 14 15]
 [ 7  8  9 16 17 18]]
arr1 = np.array([[1,2,3],
				 [4,5,6],
				 [7,8,9]])
arr2 = np.array([[10,11,12],
				 [13,14,15],
				 [16,17,18]])
arr3 = np.stack((arr1,arr2), axis=0)
arr4 = np.stack((arr1,arr2), axis=1)
print(arr3)
print(arr4)
#输出结果:
[[[ 1  2  3]
  [ 4  5  6]
  [ 7  8  9]]

 [[10 11 12]
  [13 14 15]
  [16 17 18]]]
  
[[[ 1  2  3]
  [10 11 12]]

 [[ 4  5  6]
  [13 14 15]]

 [[ 7  8  9]
  [16 17 18]]]
arr1 = np.array([[1,2,3],
				 [4,5,6],
				 [7,8,9]])
arr2 = np.array([[10,11,12],
				 [13,14,15],
				 [16,17,18]])
arr3 = np.vstack((arr1,arr2))
arr4 = np.hstack((arr1,arr2))
print(arr3)
print(arr4)
#输出结果:
[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]
 [13 14 15]
 [16 17 18]]
[[ 1  2  3 10 11 12]
 [ 4  5  6 13 14 15]
 [ 7  8  9 16 17 18]]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值