本系列所有文章都放在
数据科学标签,总目录如下:
NumPy 提供了丰富的方法来创建 ndarray,根据使用场景的不同,可以分为以下几大类:
| 用途 | 方法 |
|---|---|
| 基础构造 | np.array()、np.copy() |
| 预定义形状填充 | np.zeros()、np.ones()、np.empty()、np.full() |
| 基于数值范围生成 | np.arange()、np.linspace()、np.logspace() |
| 特殊矩阵生成 | np.eye()、np.diag() |
| 随机数组生成 | np.random.rand()、np.random.randn()、np.random.randint() |
下面逐一介绍这些创建方法。
4.1 基础构造
4.1.1 np.array()
np.array() 是最基础的创建方法,可以从 Python 列表、元组等序列对象创建 ndarray。
import numpy as np
list1 = [4, 5, 6]arr = np.array(list1, dtype=np.float64) # 指定数据类型print(arr.ndim) # 属性和方法的区分:是否带括号,带括号的是方法,不带括号的是属性print(arr)输出:
1[4. 5. 6.]通过 dtype 参数可以指定数组的元素类型。上述代码中,虽然列表元素是整数,但指定 dtype=np.float64 后,数组元素被转换为浮点型。
4.1.2 np.copy()
np.copy() 用于创建一个与原数组内容相同但相互独立的新数组。修改新数组不会影响原数组。
arr1 = np.copy(arr) # 元素跟原始的数组相同,但是不是一个数组了print(arr1)arr1[0] = 8print(arr1)print(arr) # 原始数组不变输出:
[4. 5. 6.][8. 5. 6.][4. 5. 6.]np.copy() 执行的是深拷贝,新数组与原数组在内存中完全独立。这与直接赋值(arr1 = arr)不同,直接赋值只是创建了一个引用,修改其中一个会影响另一个。
4.2 预定义形状填充
这类方法用于快速初始化固定形状的数组,常用于数据占位和预处理。
4.2.1 np.zeros()
创建一个全 0 数组。
arr = np.zeros((2, 3), dtype=int) # 创建一个2行3列的全0数组print(arr)print(arr.dtype)输出:
[[0 0 0] [0 0 0]]int64arr = np.zeros((200,), dtype=int) # 创建一个200个元素的全0数组print(arr)输出:
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]注意: shape 参数需要传入一个元组。一维数组的形状为 (200,),二维数组的形状为 (2, 3)。
4.2.2 np.ones()
创建一个全 1 数组。
arr = np.ones((5, 8), dtype=int) # 创建一个5行8列的全1数组print(arr)输出:
[[1 1 1 1 1 1 1 1] [1 1 1 1 1 1 1 1] [1 1 1 1 1 1 1 1] [1 1 1 1 1 1 1 1] [1 1 1 1 1 1 1 1]]4.2.3 np.empty()
创建一个未初始化的数组。由于不需要填充初始值,执行效率比 np.zeros() 更快。
arr = np.empty((4, 3)) # 创建一个4行3列的未初始化数组,执行效率快print(arr)输出:
[[1.31228284e-311 2.47032823e-322 0.00000000e+000] [0.00000000e+000 8.06630440e-308 2.92966904e-033] [4.71483083e-090 9.76836074e+165 1.55155023e+184] [9.95849747e-047 3.99910963e+252 2.32253274e-056]]数组中的值是内存中的随机垃圾值,在使用前需要先赋值覆盖。适用于后续会完全填充数据的场景。
4.2.4 np.full()
创建一个指定形状并填充固定值的数组。
arr = np.full((3, 4), 2026) # 创建一个3行4列的全2026数组print(arr)输出:
[[2026 2026 2026 2026] [2026 2026 2026 2026] [2026 2026 2026 2026]]4.2.5 基于已有形状的快捷方法
NumPy 还提供了 _like 系列方法,可以创建与已有数组形状相同的新数组:
arr1 = np.zeros_like(arr) # 创建一个与arr形状相同的全0数组print(arr1)arr1 = np.empty_like(arr) # 创建一个与arr形状相同的未初始化数组print(arr1)arr1 = np.ones_like(arr) # 创建一个与arr形状相同的全1数组print(arr1)arr1 = np.full_like(arr, 2025) # 创建一个与arr形状相同的全2025数组print(arr1)输出:
[[0 0 0 0] [0 0 0 0] [0 0 0 0]][[ 2656090036200 50 0 0] [ 31244147616645120 4120349891991070059 3270516458839762277 7090130557940611385] [7362600585106894132 3918748936486401889 8386112019185938739 7233687420873831285]][[1 1 1 1] [1 1 1 1] [1 1 1 1]][[2025 2025 2025 2025] [2025 2025 2025 2025] [2025 2025 2025 2025]]_like 系列方法在需要创建与某个数组形状一致的占位数组时非常方便,无需手动指定 shape。
4.3 基于数值范围生成
这类方法用于生成数值序列,常用于模拟时间序列、坐标网格等。
4.3.1 np.arange()
生成等差数列,用法类似 Python 内置的 range(),但返回的是 ndarray。
arr = np.arange(2, 12, 2) # start, stop(不取), stepprint(arr)输出:
[ 2 4 6 8 10]参数说明:start 为起始值,stop 为终止值(不包含),step 为步长。
4.3.2 np.linspace()
生成等间隔数列,与 np.arange() 的区别在于:np.linspace() 的第三个参数是元素个数(而非步长),且默认包含终止值。
arr = np.linspace(0, 100, 5) # start, stop(取), numprint(arr)输出:
[ 0. 25. 50. 75. 100.]在 0 到 100 之间均匀生成 5 个元素,间隔为 25。
指定数据类型:
arr = np.linspace(0, 100, 5, dtype=int)print(arr)arr = np.arange(0, 101, 25, dtype=int)print(arr)输出:
[ 0 25 50 75 100][ 0 25 50 75 100]通过指定 dtype=int,可以让 np.linspace() 和 np.arange() 产生相同的结果。
4.3.3 np.logspace()
生成对数间隔数列。先将指数等间隔分布,然后以指定底数取幂。
arr = np.logspace(0, 4, 3, base=2, dtype=int) # 先把指数等间隔分布在0-4之间,然后以2为底取幂print(arr)输出:
[ 1 4 16]解释:指数在 0 到 4 之间等间隔取 3 个值,即 0、2、4。然后计算 、、。
4.4 特殊矩阵生成
4.4.1 np.eye()
创建单位矩阵(主对角线上的数字为 1,其余为 0)。
arr = np.eye(3, 4, dtype=int)print(arr)输出:
[[1 0 0 0] [0 1 0 0] [0 0 1 0]]参数说明:第一个参数为行数,第二个参数为列数。当行数和列数相等时,生成的是标准单位矩阵;不等时,生成的是广义的单位矩阵。
4.4.2 np.diag()
创建对角矩阵(主对角线上是非零数字,其余为 0)。
arr = np.diag([1, 2, 3]) # 创建一个对角矩阵print(arr)输出:
[[1 0 0] [0 2 0] [0 0 3]]传入一个一维数组,np.diag() 会将其元素放置在新数组的主对角线上。
4.5 随机数组生成
随机数组生成常用于模拟实验数据、初始化神经网络权重等场景。NumPy 的 random 模块提供了多种随机数生成方法。
4.5.1 np.random.rand()
生成 0 到 1 之间的随机浮点数,服从均匀分布。
arr = np.random.rand(2, 3)print(arr)输出(结果随机):
[[0.4974305 0.00461739 0.7830449 ] [0.35404588 0.65308817 0.99276538]]4.5.2 np.random.uniform()
生成指定范围区间的随机浮点数,服从均匀分布。
arr = np.random.uniform(3, 6, (2, 3)) # 生成2行3列的随机浮点数,范围在3到6之间print(arr)输出(结果随机):
[[3.71807012 3.88918494 4.92140544] [5.65113597 5.43057318 5.76969752]]参数说明:第一个参数为下界,第二个参数为上界,第三个参数为数组形状。
4.5.3 np.random.randint()
生成指定范围区间的随机整数。
arr = np.random.randint(3, 30, (2, 3)) # 生成2行3列的随机整数,范围在3到30之间print(arr)输出(结果随机):
[[ 5 9 6] [24 23 6]]参数说明:第一个参数为下界(包含),第二个参数为上界(不包含),第三个参数为数组形状。
4.5.4 np.random.randn()
生成服从标准正态分布(均值为 0,标准差为 1)的随机数列,数值基本在 -3 到 3 之间,两边概率小,中间概率大。
arr = np.random.randn(2, 3) # 生成2行3列的随机数,服从标准正态分布print(arr)输出(结果随机):
[[-0.92029395 0.6566202 0.00439262] [ 1.92088964 1.7643093 0.92341786]]4.5.5 设置随机种子
使用 np.random.seed() 可以设置随机种子,使得每次生成的随机数序列相同,便于实验复现。
np.random.seed(20)arr = np.random.randint(1, 10, (2, 5))print(arr)输出:
[[4 5 7 8 3] [1 7 9 6 4]]设置相同的随机种子后,每次运行生成的随机数序列完全一致。这在需要复现实验结果时非常有用。
4.6 本节小结
本节完成了以下内容:
- 介绍了
np.array()和np.copy()的基础构造方法 - 讲解了预定义形状填充方法:
np.zeros()、np.ones()、np.empty()、np.full()及其_like系列 - 学习了基于数值范围生成的方法:
np.arange()、np.linspace()、np.logspace() - 了解了特殊矩阵的生成方法:
np.eye()、np.diag() - 掌握了随机数组的生成方法:
np.random.rand()、np.random.uniform()、np.random.randint()、np.random.randn()以及随机种子的设置
下一节我们将学习 ndarray 的元素数据类型。
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时
.webp)
.webp)
.webp)
.webp)
.webp)
.webp)
.webp)
.webp)
.webp)
.webp)
.webp)
.webp)
.webp)
.webp)
.webp)
.webp)
.webp)
.webp)
.webp)
.webp)
.webp)
.webp)
.webp)
.webp)
.webp)
.webp)
.webp)
.webp)
.webp)
.webp)
.webp)