在 NumPy 中,数组(ndarray)是所有数值计算的核心数据结构。几乎所有计算操作,都以数组作为输入或输出。因此,理解数组的创建方式,是学习 NumPy 的基础。
NumPy 提供了多种创建数组的函数。这些函数不仅可以从 Python 对象构造数组,还可以按固定值初始化数组、按数值序列生成数组、根据已有数组形状构造新数组,或生成具有特定结构的矩阵与网格。
从创建方式来看,NumPy 的数组创建函数通常可以分为八类:
(1)从对象或现有数据构造
(2)初始化与占位创建
(3)按已有数组模板创建
(4)按数值序列创建
(5)按结构规则创建
(6)网格与坐标创建
(7)按函数规则创建
(8)按随机数分布创建
需要注意的是,NumPy 的随机数函数也可以生成数组,但由于其涉及随机数生成器与概率分布机制,通常在随机数模块中单独介绍。
一、从对象或现有数据构造
array()
从 Python 对象创建一个新的 ndarray。
numpy.array(object, dtype=None, copy=True, order='K', ndmin=0)参数说明:
• object:Python 序列(如 list、tuple)或其他数组对象
• dtype:指定数组元素的数据类型
• copy:是否复制数据
• order:指定内存布局方式
'K':尽量保持输入数组的内存布局• ndmin:指定最小维度
示例:
arr2 = np.array([[4, 8, 6], [5, 3, 7]])asarray()
将输入对象转换为 ndarray。如果输入对象本身已经是 ndarray,通常不会复制数据。
numpy.asarray(a, dtype=None, order=None)参数说明:
• a:输入对象
• dtype:指定数组元素的数据类型
• order:指定内存布局方式
示例:
arr = np.asarray(lst)asanyarray()
与 asarray() 类似,但如果输入是 ndarray 的子类(如 matrix),则保留其子类类型。
numpy.asanyarray(a, dtype=None, order=None)示例:
print(type(b))输出:
解释:
MaskedArray 是 ndarray 的一个子类,用于表示带有缺失值或无效值的数据。
copy()
创建数组的副本,返回一个新的 ndarray。
numpy.copy(a, order='K')参数说明:
• a:要复制的数组
• order:指定内存布局方式
示例:
arr2 = np.copy(arr1)fromiter()
从可迭代对象逐个读取元素并创建数组。
numpy.fromiter(iterable, dtype, count=-1)参数说明:
• iterable:可迭代对象
• dtype:输出数组的数据类型(必填)
• count:读取元素个数(-1 表示读到迭代结束)
示例:
# [0 1 4 9 16]frombuffer()
从缓冲区对象(buffer)读取数据并创建数组。
numpy.frombuffer(buffer, dtype=float, count=-1, offset=0)参数说明:
• buffer:提供数据的缓冲区对象
• dtype:指定缓冲区数据的解释类型,默认为 float
• count:读取元素的数量,-1 表示读取所有数据
• offset:从缓冲区的哪个字节开始读取
示例 1:从 bytes 创建数组
# [1 2 3 4]示例 2:解释为 16 位整数
# [1 2 3 4]说明:frombuffer() 用于将原始二进制数据直接解释为 NumPy 数组。它不复制数据,因此效率很高,常用于处理二进制文件、内存数据或网络数据流。
fromfile()
从二进制文件或文本文件中读取数据并创建数组。
numpy.fromfile(file, dtype=float, count=-1, sep='', offset=0)参数说明:
• file:文件对象或文件路径字符串
• dtype:读取数据的数据类型,默认 float
• count:读取元素个数,默认 -1 表示读取全部数据
• sep:分隔符
若指定分隔符(如 ' ' 或 ','),则按文本解析• offset:从文件的哪个字节位置开始读取(仅适用于二进制模式)
示例 1:读取二进制数据
arr = np.fromfile("data.bin", dtype=np.int32)示例 2:读取文本数据
arr = np.fromfile("data.txt", dtype=int, sep=' ')fromfile() 可以直接从文件中读取数据创建数组,效率较高,但生成的文件格式缺乏跨平台兼容性,因此在实际工程中更常使用 np.load() / np.save() 等 NumPy 专用格式。
fromstring()
从字符串中解析数据并创建数组。
numpy.fromstring(string, dtype=float, count=-1, sep='')参数说明:
• string:包含数据的字符串或字节对象
• dtype:输出数组的数据类型,默认 float
• count:读取元素个数,默认 -1 表示读取全部
• sep:分隔符
若指定分隔符,则按文本解析示例 1:从字符串读取数值
# [1 2 3 4 5]示例 2:解析逗号分隔数据
# [10 20 30 40]fromstring() 常用于将文本数据快速转换为 NumPy 数组,但在处理复杂文本格式时,通常更推荐使用 np.loadtxt() 或 np.genfromtxt()。
二、初始化与占位创建
这一类函数用于创建指定形状的数组,并用某种默认值填充。
zeros()
创建一个元素全部为 0 的数组。
numpy.zeros(shape, dtype=float)参数说明:
• shape:数组形状
• dtype:数组元素的数据类型
示例:
np.zeros((2, 3))输出:
[0. 0. 0.]]ones()
创建一个元素全部为 1 的数组。
numpy.ones(shape, dtype=float)示例:
np.ones((2, 3))empty()
用于创建空数组(未初始化数组)。
numpy.empty(shape, dtype=float)这种方式创建数组速度最快。但数组内容未初始化,其值来自内存中的残留数据,因此是不确定的。
示例:
np.empty((2, 2))full()
创建数组并用指定值填充。
numpy.full(shape, fill_value, dtype=None)示例:
np.full((2,3), 5)输出:
[5 5 5]]三、按已有数组模板创建
zeros_like()
创建一个与数组 a 形状相同的全 0 数组。
numpy.zeros_like(a, dtype=None, order='K', subok=True, shape=None)参数说明:
• a:参考数组(决定输出形状)
• dtype:指定输出类型(默认沿用 a)
• order:内存布局('C'/'F'/'A'/'K')
• subok:是否保留子类类型(默认 True)
• shape:指定输出形状(覆盖 a 的 shape,可选)
示例:
arr = np.zeros_like(a)ones_like()
用于创建一个与数组 a 形状相同的全 1 数组。
numpy.ones_like(a, dtype=None, order='K', subok=True, shape=None)示例:
arr = np.ones_like(a)empty_like()
创建一个与数组 a 形状相同、但不初始化内容的数组(值不确定)。
numpy.empty_like(a, dtype=None, order='K', subok=True, shape=None)示例:
b = np.empty_like(a)full_like()
创建与数组 a 形状相同的数组,并用指定值填充。
numpy.full_like(a, fill_value, dtype=None, order='K', subok=True, shape=None)示例:
np.full_like(a, 9)四、按数值序列创建
arange()
生成等差序列数组,类似 range()。
numpy.arange([start,] stop[, step], dtype=None)示例:
# [0 2 4 6 8]linspace()
在指定区间内生成等间隔的数值。
numpy.linspace(start, stop, num=50, endpoint=True, dtype=None)参数说明:
• start:序列起始值
• stop:序列结束值
• num:生成样本数量(默认 50)
• endpoint:是否包含结束值 stop(默认 True)
• dtype:返回数组的数据类型,默认根据输入自动推断(通常为 float)
示例:
# [0. 0.25 0.5 0.75 1. ]logspace()
生成对数间隔序列。
numpy.logspace(start, stop, num=50, endpoint=True, base=10.0)参数说明:
• start:起始指数值
• stop:结束指数值
• num:生成元素个数(默认 50)
• endpoint:是否包含结束指数对应的值(默认 True)
• base:对数的底数(默认为 10)
示例:
# [1. 10. 100. 1000.]geomspace()
生成等比数列。
numpy.geomspace(start, stop, num=50, endpoint=True, dtype=None)参数说明:
• start:序列起始值
• stop:序列结束值
• num:生成元素个数(默认 50)
• endpoint:是否包含终点值 stop(默认 True)
• dtype:指定输出数组的数据类型
示例 1:
# [ 1. 10. 100. 1000.]示例 2:
# [ 1. 2. 4. 8. 16.]说明:geomspace() 用于生成等比序列数组。与 linspace()(等差序列)和 logspace()(对数刻度序列)相比,它直接按照比例关系生成数据,常用于对数尺度计算和科学建模。
五、按结构规则创建
eye()
创建一个二维数组,其指定对角线上的元素为 1,其余元素为 0。
numpy.eye(N, M=None, k=0, dtype=float)当 N == M 且 k=0 时,其结果是标准单位矩阵(identity matrix),即,是一个方阵,其主对角线元素为 1,其余元素为 0。
参数说明:
• N: 矩阵的行数
• M:矩阵的列数,默认与 N 相同
• k:对角线位置偏移量
0 表示主对角线,正数表示上对角线,负数表示下对角线。示例:
np.eye(3)输出:
[0. 0. 1.]]identity()
创建 n × n 单位矩阵。
numpy.identity(n, dtype=None)示例:
np.identity(3)tri()
创建一个下三角矩阵(lower triangular matrix)。
numpy.tri(N, M=None, k=0, dtype=float)参数说明:
• N: 矩阵的行数
• M:矩阵的列数,默认与 N 相同
• k:对角线位置偏移量
0 表示主对角线,正数表示上移,负数表示下移。示例:
print(a)输出:
[1. 1. 1.]]tril()
返回数组 m 的下三角部分。
numpy.tril(m, k=0)参数说明:
• m:输入数组(通常为二维矩阵)
• k:对角线偏移量
示例:
print(np.tril(a))输出:
[7 8 9]]triu()
返回数组 m 的上三角部分。
numpy.triu(m, k=0)示例:
print(np.triu(a))输出:
[0 0 9]]diag()
从一维数组生成对角矩阵,或从二维数组提取指定对角线。
numpy.diag(v, k=0)参数说明:
• v:一维向量(生成对角矩阵)或二维矩阵(提取对角线)
• k:对角线偏移(0 主对角线;正上负下)
示例 1:由向量生成对角矩阵
np.diag(v)输出:
[0 0 3]]示例 2:从矩阵提取对角线
# [2 6]diagflat()
将输入展平并生成对角矩阵。
numpy.diagflat(v)示例:
np.diagflat([1,2,3])输出:
[0 0 3]]六、网格与坐标创建
indices()
生成索引网格数组:返回一个形如 (ndim, ...) 的数组,表示每个维度的坐标索引。
numpy.indices(dimensions, dtype=int, sparse=False)参数说明:
• dimensions:目标网格形状,如 (2, 3)
• dtype:输出类型(默认 int)
• sparse:是否返回稀疏网格(默认 False)
示例:
np.indices((3,3))会生成两个数组:
[0 1 2]]]• 第一个矩阵 → 行索引
• 第二个矩阵 → 列索引
meshgrid()
将多个一维坐标数组转换为坐标网格矩阵。
numpy.meshgrid(*xi, indexing='xy', sparse=False, copy=True)参数说明:
• *xi:一维坐标向量(可传多个)
• indexing:'xy'(默认,笛卡尔坐标)或 'ij'(矩阵索引)
• sparse:是否生成稀疏网格(默认 False)
• copy:是否复制数据(默认 True)
示例:
# X.shape == (2, 3), Y.shape == (2, 3)NumPy 还提供了专门的网格生成对象,其中mgrid通过切片语法直接生成密集网格(dense grid)。
numpy.mgrid[start:stop:step]ogrid与 mgrid 类似,也是网格生成对象,但生成的是开放网格(open grid)。
numpy.ogrid[start:stop:step]开放网格不会生成完整的二维矩阵,而是生成可广播的一维数组,因此可以显著减少内存占用。
七、按函数规则生成
NumPy 提供了 fromfunction() 函数,用于根据数组元素的索引位置调用用户定义的函数,从而生成数组。
这种方式非常适合用于构造:
• 距离矩阵
• 权重矩阵
• 坐标函数
• 数值模拟网格
• 数学模式矩阵
fromfunction()
根据数组元素的索引位置调用指定函数,生成一个新的数组。
numpy.fromfunction(function, shape, *, dtype=float, like=None)参数说明:
• function:用于计算数组元素值的函数。函数的参数个数必须与数组维度相同
• shape:指定生成数组的形状
• dtype:索引数组的数据类型(默认 float)
• like:指定参考数组,用于创建与其兼容的数组(NumPy 1.20 引入)。
示例:生成行列索引之和矩阵
print(a)输出:
[2 3 4]]NumPy 会为每个维度创建一个索引数组,并将这些索引作为参数传递给 function,函数返回的结果即为数组元素值。
八、按随机数分布创建
NumPy 提供随机数生成模块 numpy.random。当前推荐使用 Generator 随机数接口。
详情请参阅:
小结
NumPy 提供了丰富的数组创建函数,可以通过对象转换、初始化函数、序列生成、模板复制、结构矩阵构造、网格生成以及随机数分布等多种方式创建 ndarray。掌握这些创建方式,可以灵活构造具有指定形状、数据类型与数值结构的数组,为后续的向量化计算与科学计算奠定基础。
“点赞有美意,赞赏是鼓励”
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.