Python-高级-Numpy简介
Numpy
是什么?
Numpy
是 Python 中科学计算的核心库。它提供了一个高性能的多维数组对象,以及用于处理这些数组的工具。
如果您已经熟悉
MATLAB
,那么您可能会发现本教程对Numpy
入门非常有用。
它主要包含下面内容:
- 一个强大的N维数组对象
- 复杂的(广播)功能
- 用于集成
C / C ++
和Fortran
代码的工具 - 提供了丰富的的线性代数,傅里叶变换和随机数等功能
除了科学计算用途外,NumPy
还可以用作通用数据的高效多维容器。可以定义任意数据类型。这使 NumPy
能够无缝快速地与各种数据库集成。特别在人工智能领域, Numpy
已经是不可或缺的基础库了。
Numpy 安装
安装 Numpy 最快的方式是通过 pip 安装,通过下面的命令进行安装
pip install numpy
然后按下回车键,系统将会自动安装 Numpy 及 Numpy 引用的包。
Numpy 安装Numpy Array
Array
是一个数值的矩阵, 所有的数值有相同类型,网格的大小由一对非负整数组成的的数值对唯一确定。
Array
维数是阵列的秩;
Array
的形状是一个整数元组,给出了每个维度的数组大小。
我们可以从嵌套的 Python
列表初始化 numpy
数组,并使用方括号访问元素:
import numpy as np
#创建一维矩阵
a = np.array([1, 2, 3])
print(type(a))
# Prints "<class 'numpy.ndarray'>"
print(a.shape)
# Prints "(3,)"
print(a[0], a[1], a[2])
# Prints "1 2 3"
# 改变矩阵中的一个值
a[0] = 5
print(a)
# Prints "[5, 2, 3]"
# 创建二维矩阵
b = np.array([[1,2,3],[4,5,6]])
print(b.shape)
# Prints "(2, 3)"
print(b[0, 0], b[0, 1], b[1, 0])
# Prints "1 2 4"
Numpy
模块内部也提供了许多创建 array
的函数:
import numpy as np
# 创建全 `0` 矩阵
a = np.zeros((2,2))
print(a)
# Prints "[[ 0. 0.]
# [ 0. 0.]]"
# 创建全 `1` 矩阵
b = np.ones((1,2))
print(b)
# Prints "[[ 1. 1.]]"
# 创建常数矩阵
c = np.full((2,2), 7)
print(c)
# Prints "[[ 7. 7.]
# [ 7. 7.]]"
# 创建 2 x 2 单位矩阵
d = np.eye(2)
print(d)
# Prints "[[ 1. 0.]
# [ 0. 1.]]"
# Create an array filled with random values
e = np.random.random((2,2))
print(e)
# Might print "[[ 0.91923167 0.08484941]
# [ 0.68726234 0.84629387]]"
Array 索引
Numpy
提供了大量的内建函数来快速操作 array
对象。
切片
如果有 Python list
的经验,对切片的操作就不会感到陌生。Numpy
也提供了切片的功能。但是有一点需要特别注意:
Numpy Array
可能是多维的,因此必须为数组的每个维指定一个切片:
import numpy as np
# 创建3行4列的二维数组
# [[ 1 2 3 4]
# [ 5 6 7 8]
# [ 9 10 11 12]]
a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
# 使用切片来拉出由前2行和第1列和第2列组成的子阵列;
# b是以下形状数组(2,2):
# [[2 3]
# [6 7]]
b = a[:2, 1:3]
# 数组的切片是对相同数据的视图,因此修改它将修改原始数组。
print(a[0, 1])
# Prints "2"
b[0, 1] = 88
# b[0, 1] 和 a[0, 1] 有相同的数据
print(a[0, 1])
# Prints "88"
Array 数据类型
每个 numpy
数组都是相同类型元素的集合。
Numpy
提供了一组可用于构造数组的大量数值数据类型。
Numpy
尝试在创建数组时猜测数据类型,但构造数组的函数通常还包含一个可选参数来显式指定数据类型。
import numpy as np
# numpy 自动选择类型
x = np.array([1, 2])
print(x.dtype)
# Prints "int64"
# numpy 自动选择类型
x = np.array([1.0, 2.0])
print(x.dtype)
# Prints "float64"
# 为 numpy 指定类型
x = np.array([1, 2], dtype=np.int64)
print(x.dtype)
# Prints "int64"
Array 运算
基本的数学函数在数组上按元素运行,既可以作为运算符重载,也可以作为 numpy
模块中的函数。
import numpy as np
x = np.array([[1,2],[3,4]], dtype=np.float64)
y = np.array([[5,6],[7,8]], dtype=np.float64)
# 元素和,两种方式都会产生新的array 对象
# [[ 6.0 8.0]
# [10.0 12.0]]
print(x + y)
print(np.add(x, y))
# 元素差,两种方式都会产生新的array 对象
# [[-4.0 -4.0]
# [-4.0 -4.0]]
print(x - y)
print(np.subtract(x, y))
# 元素相乘,两种方式都会产生新的array 对象
# [[ 5.0 12.0]
# [21.0 32.0]]
print(x * y)
print(np.multiply(x, y))
# 元素相除,两种方式都会产生新的array 对象
# [[ 0.2 0.33333333]
# [ 0.42857143 0.5 ]]
print(x / y)
print(np.divide(x, y))
# 元素的平方根,产生新的array 对象
# [[ 1. 1.41421356]
# [ 1.73205081 2. ]]
print(np.sqrt(x))
广播
Numpy
的广播是一种强大的机制,允许 numpy
对象在执行算术运算时使用不同形状的数组。
我们经常有一个较小的数组和一个更大的数组,我们希望多次使用较小的数组来对较大的数组执行某些操作。
import numpy as np
# 将向量v添加到矩阵x的每一行,将结果存储在矩阵y中
x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
v = np.array([1, 0, 1])
y = np.empty_like(x) # 创建一个与x形状相同的空矩阵
# 添加向量v到矩阵x的每一行,
# 显式循环
for i in range(4):
y[i, :] = x[i, :] + v
# Now y is the following
# [[ 2 2 4]
# [ 5 5 7]
# [ 8 8 10]
# [11 11 13]]
print(y)
用一张图来理解这个过程:
广播示意图
广播的功能,在机器学习中有大量的应用。
广播通常会使您的代码更简洁,更快速,因此应该尽可能地使用它。
基于 Numpy
提供高级功能的第三方库
Numpy
提供了一个高性能的多维数组和基本工具来计算和操作这些数组。 很多的第三方库基于 numpy
提供的功能,定制化了很多新的功能,下面挑取一部分进行简介。
SciPy
Scipy
在numpy
为基础,提供了大量在numpy
数组上运行的函数,适用于不同类型的科学和工程应用程序。
SciPy
提供了一些处理图像的基本功能。
例如,它具有将图像从磁盘读取到numpy
数组,将numpy
数组作为图像写入磁盘以及调整图像大小的功能。
这是一个展示这些功能的简单示例
from scipy.misc import imread, imsave, imresize
# 读取本地的图片文件到 numpy array
img = imread('temp/cat.jpg')
print(img.dtype, img.shape)
# Prints "uint8 (400, 248, 3)"
# 我们可以通过用不同的标量常数列出图片的参数。
# 图像具有形状(400,248,3);
# 我们将它乘以形状一维的数组[1,0.95,9.9];
# `numpy` 广播机制意味着它保持红色通道不变,并将绿色和蓝色通道分别乘以0.95和0.9。
img_tinted = img * [1, 0.95, 0.9]
# 同时将图片的size 调整为 300 x 300
img_tinted = imresize(img_tinted, (300, 300))
# 将修改后图片写进本地文件
imsave('temp/cat_tinted.jpg', img_tinted)
图片效果图
更多的例子请到 https://scipy.org/
Matplotlib
Matplotlib
是一个绘图库。
本节简要介绍matplotlib.pyplot模块,该模块提供了类似于MATLAB的绘图系统。
import numpy as np
import matplotlib.pyplot as plt
# 在正弦曲线上输入点的x和y坐标
x = np.arange(0, 3 * np.pi, 0.1)
y = np.sin(x)
# 使用 matplotlib 显示绘制的图形
plt.plot(x, y)
# 必须呼叫 plt.show() 才能显示图片
plt.show()
sin(x)
一个同时显示 sin(x) 和 cos(x) 的例子
import numpy as np
import matplotlib.pyplot as plt
# Compute the x and y coordinates for points on sine and cosine curves
x = np.arange(0, 3 * np.pi, 0.1)
y_sin = np.sin(x)
y_cos = np.cos(x)
# Plot the points using matplotlib
plt.plot(x, y_sin)
plt.plot(x, y_cos)
plt.xlabel('x axis label')
plt.ylabel('y axis label')
plt.title('Sine and Cosine')
plt.legend(['Sine', 'Cosine'])
plt.show()
sin VS. cos
更多的例子请到 https://matplotlib.org/