您现在的位置是:首页 > 技术教程 正文

【Python 零基础入门】Numpy 常用函数 通用函数 & 保存加载

admin 阅读: 2024-03-25
后台-插件-广告管理-内容页头部广告(手机)

【Python 零基础入门】内容补充 4 Numpy 常用函数 通用函数 & 保存加载

  • 概述
  • 通用函数
    • np.sqrt 平方根
    • np.log 对数
    • np.exp 指数
    • np.sin 正弦
  • 点积和叉积
    • np.dot 点积
    • 叉积
  • 矩阵乘法
    • np.matmul
    • @
  • 保存 & 加载
    • np.save 保存单个数组
    • np.savez 保存多个数组
    • np.savez_compressed 保存
    • np.load 加载
    • npy vs npz

概述

Numpy (Numerical Python) 是 Python 编程语言的一个扩展程序库, 支持大量的维度数组与矩阵运算, 并提供了大量的数学函数库. Numpy 利用了多线程数组来存储和处理大型数据集, 从而提供了一个高效的方式来进行数值计算, 特别是对于矩阵预算和线性代数.

Python Numpy 常用函数

通用函数

通用函数 (Ufuncs) 是 numpy 的核心部分. 通用函数提供了快速的元素级运算. 这些函数都是在 C 语言级别编写的, 因此能提供 Python 所不具备的高性能. 通用函数的另一个又是是能够直接读取数据, 避免了在 Python 循环中处理数据的开销.

Numpy 通用函数

np.sqrt 平方根

例子:

# 原始数组 array = np.array([1, 2, 3]) # 平方根 sqrt_array = np.sqrt(array) # 调试输出 print("原始数组:", array) print("平方根数组:", sqrt_array)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

输出结果:

原始数组: [1 2 3] 平方根数组: [1. 1.41421356 1.73205081]
  • 1
  • 2

np.log 对数

np.log对数组中每个元素计算自然对数 l o g e ( X ) log_e(X) loge(X)

例子:

# 原始数组 array = np.array([1, 2, np.e]) # 对数 log_array = np.log(array) # 调试输出 print("原始数组:", array) print("对数数组:", log_array)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

输出结果:

原始数组: [1. 2. 2.71828183] 对数数组: [0. 0.69314718 1. ]
  • 1
  • 2

np.exp 指数

np.exp对数组中每个元素计算自然指数 e x e^x ex

例子:

# 原始数组 array = np.array([1, 2, 3]) # 平方根 exp_array = np.exp(array) # 调试输出 print("原始数组:", array) print("指数数组:", exp_array)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

输出结果:

原始数组: [1 2 3] 指数数组: [ 2.71828183 7.3890561 20.08553692]
  • 1
  • 2

np.sin 正弦

例子:

# 原始数组 array = np.array([1, 2, 3]) # 正弦 sin sin_array = np.sin(array) # 调试输出 print("原始数组:", array) print("正弦数组:", sin_array)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

输出结果:

原始数组: [1 2 3] 正弦数组: [0.84147098 0.90929743 0.1411200
  • 1
  • 2

点积和叉积

np.dot 点积

点积 (Dot Product) 是线性代数中的基本运算. 点积是将两个向量的对应坐标相乘然后求和的运算.

对于两个变量 a 和 b, 他们的点积 a ⋅ b = a 1 b 1 + a 2 b 2 + . . . + a n b n a \cdot b = a_1b_1 + a_2b_2 + ... + a_nb_n ab=a1b1+a2b2+...+anbn

例子:

# 定义两个向量 a = np.array([1, 2]) b = np.array([3, 4]) # 计算点积 dot_result = np.dot(a, b) # 1*3 + 2*4 = 11 # 调试输出 print("数组 a:", a) print("数组 b:", b) print("点积结果:", dot_result)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

输出结果:

数组 a: [1 2] 数组 b: [3 4] 点积结果: 11
  • 1
  • 2
  • 3

叉积

叉积 (Cross Product) 也是线性代数中的基本运算. 叉积是一个向量运算, 其结果是一个新的向量. 叉积的方向遵循右手定则, 大小等于两个向量构成的平行四边形的面积. 对于三味空间中的两个向量 a 和 b, 它们的叉积是 a × b = ( a 2 b 3 − a 3 b 2 , a 3 b 1 − a 1 b 3 , a 1 b 2 − a 2 b 1 ) a \times b = (a_2b_3 - a_3b_2, a_3b_1 - a_1b_3, a_1b_2 - a_2b_1) a×b=(a2b3a3b2,a3b1a1b3,a1b2a2b1)

例子:

# 定义两个三维向量 a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) # 计算叉积 cross_result = np.cross(a, b) # 2*6 - 3*5, 3*4 - 1*6, 1*5 - 2*4 = [-3, 6, 3] # 调试输出 print("数组 a:", a) print("数组 b:", b) print("叉积结果:", cross_result)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

输出结果:

数组 a: [1 2 3] 数组 b: [4 5 6] 叉积结果: [-3 6 -3]
  • 1
  • 2
  • 3

矩阵乘法

矩阵乘法 (Matrix Multiplication) 是将 A, B 两个矩阵相乘得到一个新的矩阵 C. 其元素由 A 的行和 B 的列对应的元素相乘然后求和得到.

np.matmul

例子:

# 定义两个矩阵 matrix1 = np.array([[1, 2], [3, 4]]) matrix2 = np.array([[5, 6], [7, 8]]) # 使用 np.matmul 进行矩阵乘法 matmul_result = np.matmul(matrix1, matrix2) # 1*5 + 2*7, 1*6 + 2*8 = [19, 22] # 3*5 + 4*7, 3*6 + 4*8 = [43, 50] # 调试输出 print("矩阵1:", matrix1, sep="\n") print("矩阵2:", matrix2, sep="\n") print("使用 np.matmul:", matmul_result, sep="\n")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

输出结果:

矩阵1: [[1 2] [3 4]] 矩阵2: [[5 6] [7 8]] 使用 np.matmul: [[19 22] [43 50]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

@

例子:

# 定义两个矩阵 matrix1 = np.array([[1, 2], [3, 4]]) matrix2 = np.array([[5, 6], [7, 8]]) # 使用 @ 运算符进行矩阵乘法 operator_result = matrix1 @ matrix2 # 1*5 + 2*7, 1*6 + 2*8 = [19, 22] # 3*5 + 4*7, 3*6 + 4*8 = [43, 50] # 调试输出 print("矩阵1:", matrix1, sep="\n") print("矩阵2:", matrix2, sep="\n") print("使用 @:", operator_result, sep="\n")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

输出结果:

矩阵1: [[1 2] [3 4]] 矩阵2: [[5 6] [7 8]] 使用 @: [[19 22] [43 50]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

保存 & 加载

在日常编程中, 我们经常需要将 Numpy 数组保存到文件中, 以便日后加载和食用. 下面我们来讲一下如恶化保存和加载 ndarray 对象.

Numpy 保存加载

np.save 保存单个数组

np.save将单个 ndarray 保存到一个二进制文件中, 文件扩展名通常为 “.npy”.

例子:

# 创建数组 array = np.array([1, 2, 3, 4]) # 保存数组 np.save("array.npy", array)
  • 1
  • 2
  • 3
  • 4
  • 5

np.savez 保存多个数组

np.savez将多个 ndarray 保存到一个二进制文件中, 文件扩展名通常为 “.npy”.

例子:

# 创建数组 array1 = np.array([1, 2, 3, 4]) array2 = np.array([5, 6, 7, 8]) # 保存多个数组 np.savez("arrays.npz", array1=array1, array2=array2)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

np.savez_compressed 保存

np.savez_compressed与np.savez不同, 会对数组进行压缩.

例子:

# 创建数组 array1 = np.zeros(30000) array2 = np.ones(30000) # 保存多个数组 np.savez("arrays.npz", array1=array1, array2=array2) np.savez_compressed("arrays_compressed.npz", array1=array1, array2=array2) # 查看文件大小 arrays_size = os.path.getsize("arrays.npz") arrays_compressed_size = os.path.getsize("arrays_compressed.npz") print("无压缩大小: {} kb".format(arrays_size // 1024)) print("压缩大小: {} kb".format(arrays_compressed_size // 1024))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

输出结果:

无压缩大小: 469 kb 压缩大小: 1 kb
  • 1
  • 2

np.load 加载

np.load可以帮助我们加载保存的文件, 加载 “.npy” 和 “.npz” 文件.

加载单个数组:

# 加载单个数组 array = np.load("array.npy") print(array)
  • 1
  • 2
  • 3

输出结果:

[1 2 3 4]
  • 1

加载多个数组:

# 加载多个数组 loaded_array = np.load("arrays.npz") array1 = loaded_array["array1"] array2 = loaded_array["array2"] print(array1) print(array2)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

输出结果:

[1 2 3 4] [5 6 7 8]
  • 1
  • 2

npy vs npz

npy 文件:

  • 单个数组: .npy 格式用于保存单个 NumPy 数组
  • 二进制: .npy 是一个二进制文件, 数据以二进制形式存储在文件中. 这样可以更快的读写数据, 并更紧凑的存储, 不会像文件那样占用额外的空间.
  • 无压缩: .npy 文件不提供压缩功能, 保存的文件大小直接对应于数组内容的大小

npz 文件:

  • 多个数组: .npz 格式用于保存多个 NumPy 数组. 通过将数组以关键字参数的形式传递给np.savez或np.savez_compressed函数来实现
  • 压缩: .npz 文件可以选择压缩与否. 使用np.savez时, 数据不会被压缩, 而使用np.savez_compressed函数时, 所有数据都会被压缩. 通过压缩可以显著减少文件的大小, 特别是对于包含大量重复数据的数组
标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索
排行榜