2173 字
11 分钟
页面浏览--访问次数--
数据分析|ndarray的创建

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] = 8
print(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]]
int64
arr = 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(不取), step
print(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(取), num
print(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。然后计算 20=12^0=1、22=42^2=4、24=162^4=16。


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 的元素数据类型。


数据分析

连载中

第 4 篇,共 21 篇本文属于系列

数据分析|ndarray的创建
https://luq-blog.xyz/posts/2026-07-01-data-notes-04-ndarray-creation/
作者
Luquiescene
发布于
2026-07-01
许可协议
CC BY-NC-SA 4.0

分享文章

生成精美分享图或复制链接,与更多人分享本文。

继续阅读

沿着主题读

基于共同的标签与分类

换条路线

从其他文章中稳定抽取

评论

正在加载评论...

最后更新于 ,距今已过 95 天

部分内容可能已过时