上一篇
Python中创建NumPy ndarray的两种主要方法 - 完整指南
- Python
- 2025-08-16
- 767
Python中创建NumPy ndarray的两种主要方法
全面指南:从基础到高级应用
NumPy和ndarray简介
NumPy是Python科学计算的核心库,提供了高性能的多维数组对象——ndarray。ndarray是NumPy的核心数据结构,具有以下优势:
- 高效存储:连续内存块存储同类型数据
- 快速运算:优化的C/C++后端实现向量化操作
- 广播功能:不同形状数组间的数学运算
- 丰富API:数学、逻辑、线性代数等操作
关键概念: ndarray(N-dimensional array)是NumPy的核心对象,表示多维同质数组。所有元素必须是相同类型,通过正整数元组索引。
方法一:从Python列表/元组创建
最直接的创建方法是将Python列表或元组转换为ndarray。使用numpy.array()
函数实现此转换:
基本语法
numpy.array(object, dtype=None, *, copy=True, order='K', subok=False, ndmin=0)
- object:任何暴露数组接口的对象(如列表、元组)
- dtype:可选,指定数组数据类型
- copy:是否复制对象(默认为True)
- ndmin:指定生成数组的最小维度
示例1:一维数组
import numpy as np # 从列表创建 arr1 = np.array([1, 2, 3, 4, 5]) print(arr1) # 输出: [1 2 3 4 5] # 从元组创建 arr2 = np.array((6, 7, 8, 9, 10)) print(arr2) # 输出: [ 6 7 8 9 10]
示例2:二维数组
# 创建二维数组 arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print(arr2d) # 输出: # [[1 2 3] # [4 5 6] # [7 8 9]] # 检查维度 print("维度:", arr2d.ndim) # 输出: 2 print("形状:", arr2d.shape) # 输出: (3, 3)
指定数据类型和维度
# 指定数据类型 float_arr = np.array([1, 2, 3], dtype=float) print(float_arr) # 输出: [1. 2. 3.] # 指定最小维度 arr_3d = np.array([1, 2, 3], ndmin=3) print(arr_3d) # 输出: [[[1 2 3]]] print("形状:", arr_3d.shape) # 输出: (1, 1, 3)
方法二:使用NumPy内置函数创建
NumPy提供了一系列函数来创建特殊数组,无需手动输入每个元素:
zeros() - 创建全0数组
# 创建3x4的全0数组 zeros_arr = np.zeros((3, 4)) print(zeros_arr) # 输出: # [[0. 0. 0. 0.] # [0. 0. 0. 0.] # [0. 0. 0. 0.]]
ones() - 创建全1数组
# 创建2x3的全1数组 ones_arr = np.ones((2, 3)) print(ones_arr) # 输出: # [[1. 1. 1.] # [1. 1. 1.]]
arange() - 创建数值范围数组
# 创建0-9的数组 arr1 = np.arange(10) print(arr1) # 输出: [0 1 2 3 4 5 6 7 8 9] # 创建5-15,步长为2的数组 arr2 = np.arange(5, 16, 2) print(arr2) # 输出: [ 5 7 9 11 13 15]
linspace() - 创建等差数组
# 创建0-1之间5个等间隔数 arr = np.linspace(0, 1, 5) print(arr) # 输出: [0. 0.25 0.5 0.75 1. ]
eye() - 创建单位矩阵
# 创建3x3单位矩阵 identity = np.eye(3) print(identity) # 输出: # [[1. 0. 0.] # [0. 1. 0.] # [0. 0. 1.]]
random() - 创建随机数组
# 创建2x3的随机数组(0-1之间) rand_arr = np.random.rand(2, 3) print(rand_arr) # 输出示例: # [[0.548 0.715 0.603] # [0.545 0.424 0.646]] # 创建标准正态分布的数组 normal_arr = np.random.randn(3, 3) print(normal_arr) # 输出示例: # [[-0.234 0.542 -1.213] # [ 0.302 -0.672 0.467] # [-0.912 0.256 1.098]]
两种方法对比
特性 | 从列表/元组创建 | 使用内置函数 |
---|---|---|
适用场景 | 数据已存在Python数据结构中 | 需要特殊模式或随机数据 |
灵活性 | 高 - 可创建任意数据的数组 | 中 - 限于特定模式 |
性能 | 一般(需要转换数据结构) | 高(直接生成) |
大数组创建 | 不推荐(内存效率低) | 推荐(高效) |
典型用例 | 小数据集、不规则数据 | 数学计算、机器学习初始化 |
选择指南
- 使用列表/元组转换: 当数据已经在Python列表或元组中,或需要创建不规则模式的数组时
- 使用内置函数: 当需要创建有数学规律的数组(全0、全1、范围数组等)或随机数组时
- 大型数组: 优先使用内置函数,避免创建中间Python列表
- 性能敏感场景: 内置函数通常有更好的性能,特别是对于大型数组
实际应用示例
图像处理
# 创建空白RGB图像 (300x400像素) height, width = 300, 400 image = np.zeros((height, width, 3), dtype=np.uint8) # 设置背景为蓝色 image[:, :] = [0, 120, 255] # 在中间添加一个黄色矩形 image[100:200, 150:250] = [255, 255, 0]
科学计算
# 创建网格坐标 x = np.linspace(-5, 5, 100) y = np.linspace(-5, 5, 100) X, Y = np.meshgrid(x, y) # 计算二元函数 (例如:Rosenbrock函数) Z = (1 - X)**2 + 100 * (Y - X**2)**2 # 计算梯度 dx, dy = np.gradient(Z)
机器学习
# 初始化神经网络权重 def initialize_parameters(layer_dims): parameters = {} L = len(layer_dims) for l in range(1, L): # 使用内置函数创建权重矩阵 parameters['W' + str(l)] = np.random.randn( layer_dims[l], layer_dims[l-1]) * 0.01 parameters['b' + str(l)] = np.zeros((layer_dims[l], 1)) return parameters # 3层神经网络:[输入层, 隐藏层, 输出层] layer_dims = [784, 128, 10] params = initialize_parameters(layer_dims)
总结
NumPy提供了两种创建ndarray的主要方法:从Python列表/元组转换和使用内置函数。每种方法都有其适用场景:
列表/元组转换
- 适合已有数据在Python结构中
- 灵活性高,可创建任意数据数组
- 使用
np.array()
函数 - 小数据集首选方法
内置函数创建
- 适合创建特殊模式数组
- 高效,尤其对于大型数组
- 包括
zeros()
,ones()
,arange()
等 - 科学计算和机器学习首选
最佳实践建议
- 在性能敏感场景优先使用内置函数
- 创建大型数组时避免使用Python列表转换
- 明确指定
dtype
以控制内存使用和精度 - 利用
np.random
模块创建随机数据 - 组合使用两种方法处理复杂数据结构
本文由HouXin于2025-08-16发表在吾爱品聚,如有疑问,请联系我们。
本文链接:https://www.521pj.cn/20258259.html
发表评论