一、引言
- Numpy(Numerical Python)是一个开源的Python科学计算库,它的出现让我们可以更加方便的使用数组、进行矩阵运算,还提供了大量的数学函数库供使用者直接调用。
- 对于同样的数值运算任务,使用numpy要比直接写python代码具有更简洁的代码和更高效的性能,而且numpy是sklearn、tensorflow等各大数据科学框架的基础库,对于numpy的学习对于我们进一步理解这些库具有非常大的帮助。
- numpy的学习,以读懂为首要目的,争取快速入坑(建议亲自动手敲一遍代码),所有相关的操作不用死记硬背,用时再查。
## numpy安装
# pip install Numpy
import numpy as np
np.__version__
二、创建array对象
2.1 从其它数据类型创建array
# 从Python的列表创建array
## 一维数组
arr1 = np.array([0,2,4,6,8])
## 二维数组
arr2 = np.array(
[
[0,2,4,6,8],
[1,3,5,7,9]
]
)
2.1 从其它数据类型直接创建array
# 从其它库函数数据创建array
from PIL import Image ## 也可以借助cv2
image_dog=Image.open('./images/dog.png')
print(type(image_dog))
image_dog_np=np.array(image_dog)
print(type(image_dog_np))
print(image_dog_np.shape) ## 打印数组的维度
print(image_dog_np.dtype) ## 打印ndarray对象的元素类型
打印结果:
2.2 借助numpy的预定函数如:arange、ones、empty等进行创建
# 使用np.arange创建数组
array_arange = np.arange(0,10,2) ## 创建0-10步数为2的数组,用过Matlab的同学应该很熟悉
# 使用np.zeros创建全零数组
array_zeros = np.zeros((2,3)) ## 创建2行3列的全零数组
# 使用np.full创建指定值的数组
array_full = np.full((2,2),"polars") ## 注意numpy的array同样能够容纳str类型的数据
打印结果:
# 使用np.empty创建一个指定形状和数据类型且未初始化的数组:
array_empty = np.empty([3,2], dtype = float)
## 注:此方法得到的array数据都是未初始化的,这意味着里面的值是不确定的值,未明确赋值前尽量不要用
tips:
- 除了以上所列函数意外,还有诸如linspace、logspace、ones_like等函数,根据自己所需灵活取用即可。
- numpy中数组的所有元素类型必须是唯一的,它本质上是 dtype 对象的实例,并对应唯一的字符。
2.3 使用random模块生成随机数的数组
# 使用np.random.random创建数组
array_random = np.random.random((3,2)) ## 创建3行2列的数组,里面的值是0-1之间的随机数
案例1:随机漫步
一个简单的数组创建的例子:从0开始,已知步长1和-1出现的概率相等,通过各种方式实现1000步的随机漫步。
%%time
# (1)通过内置的random模块以纯Python的方式实现
import random
position = 0
walk = [position]
steps = 1000
for i in range(steps):
step = 1 if random.randint(0, 1) else -1
position += step
walk.append(position)
# 画出折线图
import matplotlib.pyplot as plt
plt.plot(walk[:100])
%%time是一个魔术命令,它是IPython的一部分,可以用来打印整个单元格的执行时间。
%%time
# (2)用np.random模块一次性随机产生
nsteps = 1000
draws = np.random.randint(0, 2, size=nsteps)
steps = np.where(draws > 0, 1, -1)
walk = steps.cumsum()
plt.plot(walk[:100])
对比一下不难发现,相同的问题,基于NumPy的数据处理速度要比纯Python快10到100倍(甚至更快),并且使用的内存更少。
三、Numpy基本运算
3.1 数组的变形
# 将数字 1~6 放入一个 2×3 的矩阵中
grid = np.arange(1, 7).reshape((2, 3))
# 矩阵的转置
grid.T
3.2 数组的运算
# 一维矩阵运算
a = np.array([10,20,30,40])
b = np.arange(4)
print(a,b