最让人暖心的Numpy笔记~干货满满!你绝对不能错过哦~~~~

NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

NumPy 的前身 Numeric 最早是由 Jim Hugunin 与其它协作者共同开发,2005 年,Travis Oliphant 在 Numeric 中结合了另一个同性质的程序库 Numarray 的特色,并加入了其它扩展而开发了 NumPy。NumPy 为开放源代码并且由许多协作者共同维护开发。

NumPy 是一个运行速度非常快的数学库,主要用于数组计算,包含:

  • 一个强大的N维数组对象 ndarray
  • 广播功能函数
  • 整合 C/C++/Fortran 代码的工具
  • 线性代数、傅里叶变换、随机数生成等功能

NumPy 通常与 SciPy(Scientific Python)和 Matplotlib(绘图库)一起使用, 这种组合广泛用于替代 MatLab,是一个强大的科学计算环境,有助于我们通过 Python 学习数据科学或者机器学习。

相关链接:
NumPy 官网: http://www.numpy.org/
NumPy 源代码:https://github.com/numpy/numpy

接下来就详细总结numpy相关笔记,相信这么暖心的笔记对你一定有很大作用,干货满满哦~~~~~~~~~~

1. 创建ndarray数组

1.1 list 创建

>>> a = np.array([1, 2, 3, 4, 5])
array([1, 2, 3, 4, 5])

1.2 自定义范围

>>> b = np.arange(1, 6)
array([1, 2, 3, 4, 5])

1.3 全0的ndarray数组

>>> c = np.zeros([5]) # 5列
array([0., 0., 0., 0., 0.])

1.4 全1的ndarray数组

>>> d = np.ones([5, 1]) # 5行
array([[1.],
[1.],
[1.],
[1.],
[1.]])

2. 属性(方法)

2.1 形状(.shape)

>>> d.shape
(5, 1)

2.2 重塑(.reshape)

>>> d = d.reshape(1, 5)
>>> d
array([[0., 0., 0., 0., 0.]])

2.3 数据类型(.dtype)

>>> d.dtype
dtype('float64')

2.4 更改数据类型(.astype)

>>> d = d.astype('int64')
>>> d
array([[0],
[0],
[0],
[0],
[0]], dtype=uint8)

2.5 元素个数(.size)

>>> d.size
5

2.6 维度(.ndim)

>>> d.ndim
2

3. 切片

3.1 数组切片是原始数组的“视图”

>>> a = np.arange(30)
>>> a_slice = a[4:7] # arr_slice 可以看作指向a的指针
>>> a_slice[0] = 100
>>> a, a_slice
(array([ 0, 1, 2, 3, 100, 5, 6, 7, 8, 9, 10, 11, 12,
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
26, 27, 28, 29]), array([100, 5, 6]))

3.2 通过“copy”给新数组创建不同的内存空间

>>> a = np.arange(30)
>>> arr_slice = a[4:7]
>>> arr_slice = np.copy(arr_slice) # 创建副本
>>> arr_slice[0] = 100
>>> a, arr_slice
(array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]),
array([100, 5, 6]))

3.3 for循环切片

>>> a = np.arange(24).reshape(6, 4)
>>> slices = [a[k: k+2] for k in range(0, 6, 2)]
>>> slices
[array([[0, 1, 2, 3],
[4, 5, 6, 7]]), array([[ 8, 9, 10, 11],
[12, 13, 14, 15]]), array([[16, 17, 18, 19],
[20, 21, 22, 23]])]

4. 统计计算

4.1 均值(.mean)

>>> arr = np.arange(1, 10).reshape(3, 3)
>>> arr
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> arr.mean() # 方法
5.0
>>> np.mean(arr) # 函数
5.0

4.2 求和(.sum)

>>> arr.sum(), np.sum(arr) # 在终端会用元组的方式输出
(45, 45)

4.3 最值(.max)(.min)

>>> arr.max(), np.max(arr)
(9, 9)
>>> arr.min(), np.min(arr)
(1, 1)
>>> arr.min(axis = 0) # 沿着第0维,也就是求[1,4,7] [2,5,8] [3,6,9]的最小值
array([1, 2, 3])

4.4 标准差(.std)和方差(.var)

#方差:所有元素(n)减去均值的差 的平方和除以元素(n)
#标准差:方差的平方根
>>> arr.std(), arr.var()
(2.581988897471611, 6.666666666666667)

5. 随机数

5.1 生成[0, 1)之间随机数

>>> a = np.random.rand(3, 3)
array([[0.973892 , 0.62937206, 0.36038193],
[0.52590687, 0.08019958, 0.41830575],
[0.17870389, 0.47272033, 0.73129926]])

5.2 指定范围

>>> a = np.random.uniform(low = -1, high = 1, size = (2, 2)) # size控制大小
array([[-0.46710382, -0.2791821 ],
[-0.38769313, -0.57298311]])

5.3 标准正态分布

>>> a = np.random.randn(3, 3)
array([[ 0.74297669, -1.96968238, -0.32812626],
[ 0.64983009, 1.14698471, -0.74759816],
[-1.57686947, 0.34129844, 0.43061128]])

5.4 指定正态分布均值loc和方差scale

>>> a = np.random.normal(loc = 1, scale = 1, size = (3, 3))
array([[ 2.28193066, 0.78311059, 0.11834171],
[ 0.74510824, 1.92287829, 0.68975452],
[ 0.60600768, 1.62026193, -0.51754364]])

5.5 设置随机种子

# 种子可以理解为地址
# 先设置种子 np.random.seed(x) 
# 通过 np.random.randn(3, 3) 将产生的随机数存放到前面的地址x上 
# 如果想重新得到前面的随机数,可以先用1选择地址,用2收获种子(随机数)
>>> np.random.seed(666) # 选择地址(由于之前没有这个地址,所以会新建)
>>> a = np.random.randn(3, 3) # 将产生的随机数a播种到1地址中
array([[ 0.82418808, 0.479966 , 1.17346801],
[ 0.90904807, -0.57172145, -0.10949727],
[ 0.01902826, -0.94376106, 0.64057315]])
>>> b = np.random.randn(3, 3) # 未指定地址,直接产生随机数
array([[-0.78644317, 0.60886999, -0.93101185],
[ 0.97822225, -0.73691806, -0.29873262],
[-0.46058737, -1.08879299, -0.57577075]])
>>> np.random.seed(666) # 选择地址1(之前已经创建了666地址)
>>> c = np.random.randn(3, 3) # 把666地址的随机数a赋值给c
array([[ 0.82418808, 0.479966 , 1.17346801],
[ 0.90904807, -0.57172145, -0.10949727],
[ 0.01902826, -0.94376106, 0.64057315]])

5.6 随机打乱

>>> a = np.arange(10) # 1维
>>> np.random.shuffle(a)
>>> a
array([3, 5, 8, 1, 9, 2, 7, 6, 4, 0])
>>> a = np.arange(1, 10).reshape(3, 3) # 2维
>>> np.random.shuffle(a) # 在2维数组中,将行与行之间的顺序打乱
>>> a
array([[4, 5, 6],
[7, 8, 9],
[1, 2, 3]])

5.7 随机选取

>>> a = np.arange(30)
>>> b = np.random.choice(a, 5)
>>> b
array([ 5, 10, 7, 13, 1])

6. 线性代数

6.1 矩阵相乘

>>> a = np.arange(12)
>>> b = a.reshape(3, 4)
>>> c = a.reshape(4, 3)
>>> d = b.dot(c) # 等价于 np.dot(b, c)
array([[ 42, 48, 54],
[114, 136, 158],
[186, 224, 262]])

6.2 对角线和方阵的转换

>>> a = np.arange(1, 10).reshape(3, 3)
>>> b = np.diag(a) # 求方阵的对角线
>>> b
array([1, 5, 9])
>>> c = np.diag(b) # 将1维数组以对角线形式转换成方阵
>>> c
array([[1, 0, 0],
[0, 5, 0],
[0, 0, 9]])

6.3 对角线的和

>>> a = np.arange(1, 10).reshape(3, 3)
>>> np.trace(a)
15

6.4 行列式

>>> a = np.ones(3)
>>> b = np.diag(a*2)
>>> np.linalg.det(b)
7.999999999999998 # 不为8是由于精度问题,影响不大

6.5 特征值和特征向量

>>> a = np.arange(1, 10).reshape(3, 3)
>>> np.linalg.eig(a)
(array([ 1.61168440e+01, -1.11684397e+00, -1.30367773e-15]), array([[-0.23197069, -0.78583024, 0.40824829],
[-0.52532209, -0.08675134, -0.81649658],
[-0.8186735 , 0.61232756, 0.40824829]]))

6.6 逆矩阵

>>> a = np.array([[1,0,0], [-2,1,0], [0,0,1]])
>>> a_ = np.linalg.inv(a)
>>> a_
array([[ 1., -0., -0.],
[ 2., 1., 0.],
[ 0., 0., 1.]])
>>> np.dot(a, a_)
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])

7. 文件操作

7.1 读取(.fromfile)

>>> data = np.fromfile('housing.data', sep = ' ')
>>> data.shape

7.2 保存(.sabe)和加载(.load)

>>> a = np.random.rand(3,3)
>>> np.save('a.npy', a)
>>> b = np.load('a.npy')
>>> (a == b).all()
True

8. 应用

8.1 读取图像

import matplotlib.pyplot as plt
from PIL import Image

img = Image.open('xxx.jpg')
img = np.array(img)
plt.imshow(img)

8.2 翻转

img2 = img[::-1, :, :] # 垂直翻转
plt.imshow(img2)

img3 = img[:, ::-1, :] # 垂直翻转
plt.imshow(img3)

8.3 裁剪

h, w = img.shape[0], img.shape[1]
half_h = h // 2 # 裁剪的高度必须是整数
half_w = w // 2
img4 = img[half_h:h, half_w: w, :] # 1/4,保留右下角
plt.imshow(img4)

8.4 调整亮度

img5 = img * 2.0
plt.imshow(img5)

8.5 压缩

img6 = img[::2, :, :] # 垂直方向压缩
img7 = img[:, ::2, :] # 水平方向压缩

**看完来个双击,点赞+关注吧,老铁的心希望被你们融化~~~~~~**

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ywsydwsbn/article/details/107547061