学习目标:
- Numpy介绍
- Numpy和Python原生语法实现对比
- Numpy的核心array对象
- 创建array的方法
- array本身支持的大量操作和函数
学习内容:
NumPy 通常与 SciPy(Scientific Python)和 Matplotlib(绘图库)一起使用, 这种组合广泛用于替代 MatLab,是一个强大的科学计算环境,有助于我们通过 Python 学习数据科学或者机器学习。
SciPy 是一个开源的 Python 算法库和数学工具包。
SciPy 包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。
Matplotlib 是 Python 编程语言及其数值数学扩展包 NumPy 的可视化操作界面。它为利用通用的图形用户界面工具包,如 Tkinter, wxPython, Qt 或 GTK+ 向应用程序嵌入式绘图提供了应用程序接口(API)。
2.Numpy和Python原生语法实现对比
打开jupyter book
import numpy as np
def python_sum(n):
""" Python实现数组的加法
@param n:数组的长度
"""
a = [i**2 for i in range(n)]
b = [i**3 for i in range(n)]
c = []
for i in range(n):
c.append(a[i] + b[i])
return c
def numpy_sum(n):
""" numpy实现数组的加法
@param n:数组的长度
"""
a = np.arange(n) ** 2
b = np.arange(n) ** 3
return a+b
%timeit python_sum(1000)
1.06 ms ± 169 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit numpy_sum(1000)
9.16 µs ± 2.13 µs per loop (mean ± std. dev. of 7 runs, 100000 loops each)
显然numpy语法运行更快
3.Numpy的核心array对象
例子:
打开jupyter
import numpy as np
(1)创建一个一维数组,也就是Python的单元素List
# 创建一个一维数组,也就是Python的单元素List
x = np.array([1,2,3,4,5,6,7,8])
x
输出结果:array([1, 2, 3, 4, 5, 6, 7, 8])
(2)创建一个二维数组,也就是Python的嵌套List
# 创建一个二维数组,也就是Python的嵌套List
X = np.array(
[
[1,2,3,4],
[5,6,7,8]
]
)
X
输出结果:array([[1, 2, 3, 4],
[5, 6, 7, 8]])
(3)指定最小维度
a = np.array([1, 2, 3, 4, 5], ndmin = 2)
输出结果:[[1 2 3 4 5]]
这个数组最小也要是二维数组
(4)指定复数类型
a = np.array([1, 2, 3], dtype = complex)
输出结果:[1.+0.j 2.+0.j 3.+0.j]
(5)array的shape
x = np.array([1,2,3,4,5,6,7,8])
X = np.array(
[
[1,2,3,4],
[5,6,7,8]
]
)
x.shape
X.shape
输出结果:(8,)
(2, 4)
第一个是一个具有八个元素的向量
第二个是一个2行4列的矩阵
(6)array的ndim
x = np.array([1,2,3,4,5,6,7,8])
X = np.array(
[
[1,2,3,4],
[5,6,7,8]
]
)
x.ndim
X.ndim
输出结果:1
2
第一个是一维向量
第二个是二维矩阵
(7)array的size
x = np.array([1,2,3,4,5,6,7,8])
X = np.array(
[
[1,2,3,4],
[5,6,7,8]
]
)
x.size
X.size
输出结果:8
8
两个array都只有八个元素
(8)array的dtype(数据类型)
x = np.array([1,2,3,4,5,6,7,8])
X = np.array(
[
[1,2,3,4],
[5,6,7,8]
]
)
x.dtype
X.dtype
输出结果:dtype('int32')
dtype('int32')
4.创建array的方法
(1)arange
例子:
打开 jupyter
np.arange(10)
输出结果:array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.arange(2, 10, 2)
输出结果:array([2, 4, 6, 8])
(2)ones
例子:
打开jupyter
np.ones(10)
输出结果:array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
np.ones((2,3))
输出结果:array([[1., 1., 1.],
[1., 1., 1.]])
(3)ones_like
例子:
打开jupyter
x = np.array([1,2,3,4,5,6,7,8])
np.ones_like(x)
输出结果 :array([1, 1, 1, 1, 1, 1, 1, 1])
X = np.array(
[
[1,2,3,4],
[5,6,7,8]
]
)
np.ones_like(X)
输出结果:array([[1, 1, 1, 1],
[1, 1, 1, 1]])
利用已有的array,创建形状相同,但数值全为1的向量或矩阵
(4)zeros
例子:
打开jupyter
np.zeros(10)
输出结果:array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
np.zeros((2,4))
输出结果:array([[0., 0., 0., 0.],
[0., 0., 0., 0.]])
(5)zeros_like
例子:
打开jupyter
x = np.array([1,2,3,4,5,6,7,8])
np.zeros_like(x)
输出结果:array([0, 0, 0, 0, 0, 0, 0, 0])
X = np.array(
[
[1,2,3,4],
[5,6,7,8]
]
)
np.zeros_like(X)
输出结果:array([[0, 0, 0, 0],
[0, 0, 0, 0]])
利用已有的array,创建形状相同,但数值全为0的向量或矩阵
(6)empty
例子:
打开jupyter
np.empty(10)
输出结果:array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
np.empty((2,4))
输出结果:array([[0., 0., 0., 0.],
[0., 0., 0., 0.]])
注意:数据是未初始化的,里面的值可能是随机值不要用
(7)empty_like
例子:
打开jupyter
x = np.array([1,2,3,4,5,6,7,8])
np.empty_like(x)
输出结果:array([0, 0, 0, 0, 0, 0, 0, 0])
X = np.array(
[
[1,2,3,4],
[5,6,7,8]
]
)
np.empty_like(X)
输出结果:array([[0, 0, 0, 0],
[0, 0, 0, 0]])
利用已有的array,创建形状相同,但数值全为0的向量或矩阵
(8)full
例子:
打开jupyter
np.full(10, 666)
输出结果:array([666, 666, 666, 666, 666, 666, 666, 666, 666, 666])
np.full((2,4), 333)
输出结果:array([[333, 333, 333, 333],
[333, 333, 333, 333]])
(9)full_like
例子:
打开jupyter
x = np.array([1,2,3,4,5,6,7,8])
np.full_like(x)
输出结果:array([666, 666, 666, 666, 666, 666, 666, 666])
X = np.array(
[
[1,2,3,4],
[5,6,7,8]
]
)
np.full_like(X)
输出结果:array([[666, 666, 666, 666],
[666, 666, 666, 666]])
利用已有的array,创建形状相同,但数值全为该函数第二个参数值的向量或矩阵
(10)random.randn
例子:
打开jupyter
np.random.randn()
输出结果:1.1106391311802373
np.random.randn(3)
输出结果:array([0.30501947, 1.5935427 , 2.19706265])
np.random.randn(3, 2)
输出结果:array([[ 1.91805826, -0.67076574],
[-0.66382633, -0.32008601],
[-0.54977281, 0.84384816]])
np.random.randn(3, 2, 4)
array([[[ 0.7419018 , 0.22271303, -0.54512429, 0.48523073],
[ 0.01613781, 0.74694664, -0.56695606, 0.20488094]],
[[-0.08818788, 1.09166684, 0.38169304, -0.00319349],
[ 1.01200773, -0.57815559, 0.63535043, 1.41703628]],
[[-0.76849101, -1.50895899, 0.38588873, 0.97316552],
[-0.60922509, 0.62118775, -0.70502845, -0.61426203]]])
返回随机数
(11)asarray
例子:
打开jupyter
x = [1,2,3]
a = np.asarray(x)
a
输出结果:array([1, 2, 3])
x = (1,2,3)
a = np.asarray(x)
a
输出结果:array([1, 2, 3])
x = [(1,2,3),(4,5)]
a = np.asarray(x,dtype=object)
a
输出结果:array([(1, 2, 3), (4, 5)], dtype=object)
x = [1,2,3]
a = np.asarray(x, dtype = float)
a
输出结果:array([1., 2., 3.])
(12)frombuffer
例子:
打开jupyter
s = b'Hello World'
a = np.frombuffer(s, dtype = 'S1')
a
输出结果:array([b'H', b'e', b'l', b'l', b'o', b' ', b'W', b'o', b'r', b'l', b'd'], dtype='|S1')
(13)fromiter
例子:
打开jupyter
# 使用 range 函数创建列表对象
list=range(5)
it=iter(list)
# 使用迭代器创建 ndarray
x=np.fromiter(it, dtype=float)
x
输出结果:array([0., 1., 2., 3., 4.])
(14)linspace
例子:
打开jupyter
a = np.linspace(1,10,10)
a
输出结果:array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.])
a = np.linspace(10, 20, 5, endpoint = False)
a
将 endpoint 设为 false,不包含终止值:反之,则包含
输出结果:array([10., 12., 14., 16., 18.])
(15)logspace
例子:
打开jupyter
# 默认底数是 10
a = np.logspace(1.0, 2.0, num = 10)
a
输出结果:array([ 10. , 12.91549665, 16.68100537, 21.5443469 , 27.82559402, 35.93813664, 46.41588834, 59.94842503, 77.42636827, 100. ])
#将对数的底数设置为 2
a = np.logspace(0,9,10,base=2)
a
输出结果:array([ 1., 2., 4., 8., 16., 32., 64., 128., 256., 512.])
5.array本身支持的大量操作和函数
A = np.arange(10).reshape(2,5)
A
A+1
A*3
np.sin(A)
np.exp(A)
A矩阵中每个对应值都+1,-1,sin值,以e为底的指数值
把一个向量改成2x5的矩阵
输出结果:array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10]])
array([[ 0, 3, 6, 9, 12],
[15, 18, 21, 24, 27]])
array([[ 0. , 0.84147098, 0.90929743, 0.14112001, -0.7568025 ],
[-0.95892427, -0.2794155 , 0.6569866 , 0.98935825, 0.41211849]])
array([[1.00000000e+00, 2.71828183e+00, 7.38905610e+00, 2.00855369e+01, 5.45981500e+01],
[1.48413159e+02, 4.03428793e+02, 1.09663316e+03, 2.98095799e+03, 8.10308393e+03]])
B = np.random.randn(2,5)
B
A+B
A-B
A和B矩阵中每个对应值相加减
输出结果:array([[ 0.39961078, -0.2358424 , 0.22736848, -0.22654917, 0.02110567],
[ 1.20000351, -0.18548543, -1.33659976, 1.48071382, -1.73020108]])
array([[0.39961078, 0.7641576 , 2.22736848, 2.77345083, 4.02110567],
[6.20000351, 5.81451457, 5.66340024, 9.48071382, 7.26979892]])
array([[-0.39961078, 1.2358424 , 1.77263152, 3.22654917, 3.97889433],
[ 3.79999649, 6.18548543, 8.33659976, 6.51928618, 10.73020108]])