
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 的元素数据类型。
数据分析
连载中分享文章
生成精美分享图或复制链接,与更多人分享本文。
继续阅读
换条路线
从其他文章中稳定抽取
最后更新于 ,距今已过 95 天
部分内容可能已过时
评论