NumPy 创建数组
在 NumPy 中,创建数组是使用 ndarray
(N 维数组)的基础操作。NumPy 提供了多种灵活的方式来创建数组,适用于不同的数据处理需求,如科学计算、数据分析和机器学习。以下是对 NumPy 创建数组的详细中文讲解,涵盖创建方法、示例、参数说明、注意事项及最佳实践,帮助你全面掌握 NumPy 数组的创建。
一、NumPy 数组创建概述
1. 为什么需要创建数组?
- 定义:NumPy 的
ndarray
是多维、同类型的数据容器,优化了内存和计算性能。 - 用途:
- 存储和操作多维数据(如向量、矩阵)。
- 提供高效的数学运算和向量化操作。
- 作为数据科学和机器学习的基础数据结构。
- 优势:
- 比 Python 列表更快(C 实现,内存连续)。
- 支持广播、切片和丰富的数学函数。
- 与 Pandas、SciPy 等库无缝集成。
2. 基本概念
- 数组类型:
ndarray
支持任意维数(1D、2D、3D 等)。 - 数据类型(dtype):创建时可指定元素类型(如
int32
、float64
)。 - 形状(shape):定义数组的维度和大小(如
(2, 3)
表示 2 行 3 列)。
二、NumPy 创建数组的方法
NumPy 提供了多种创建 ndarray
的函数,以下按类别详细讲解。
1. 从 Python 数据结构创建
使用 np.array()
将 Python 列表、元组或其他可迭代对象转换为 ndarray
。
- 语法:
np.array(object, dtype=None, copy=True, order='K', ndmin=0)
object
:输入数据(列表、元组等)。dtype
:目标数据类型(如np.int32
)。copy
:是否复制数据(默认True
)。order
:内存布局(C
行优先,F
列优先)。ndmin
:最小维数。- 示例:
import numpy as np
# 从列表创建一维数组
arr1 = np.array([1, 2, 3])
print(arr1) # 输出:[1 2 3]
# 从列表创建二维数组
arr2 = np.array([[1, 2], [3, 4]])
print(arr2) # 输出:
# [[1 2]
# [3 4]]
# 指定数据类型
arr3 = np.array([1.5, 2.7], dtype=np.float32)
print(arr3) # 输出:[1.5 2.7]
# 从元组创建
arr4 = np.array((1, 2, 3))
print(arr4) # 输出:[1 2 3]
2. 使用内置函数创建
NumPy 提供多种函数生成特定结构的数组。
(1) 全零数组:np.zeros
- 语法:
np.zeros(shape, dtype=float, order='C')
- 示例:
zeros = np.zeros((2, 3), dtype=np.int32)
print(zeros) # 输出:
# [[0 0 0]
# [0 0 0]]
(2) 全一数组:np.ones
- 语法:
np.ones(shape, dtype=float, order='C')
- 示例:
ones = np.ones((2, 3))
print(ones) # 输出:
# [[1. 1. 1.]
# [1. 1. 1.]]
(3) 指定值填充:np.full
- 语法:
np.full(shape, fill_value, dtype=None, order='C')
- 示例:
full = np.full((2, 2), 5)
print(full) # 输出:
# [[5 5]
# [5 5]]
(4) 单位矩阵:np.eye
- 语法:
np.eye(N, M=None, k=0, dtype=float, order='C')
N
:行数。M
:列数(默认等于N
)。k
:对角线偏移(0 为主对角线)。- 示例:
eye = np.eye(3)
print(eye) # 输出:
# [[1. 0. 0.]
# [0. 1. 0.]
# [0. 0. 1.]]
(5) 等差序列:np.arange
- 语法:
np.arange(start, stop, step, dtype=None)
- 示例:
arange = np.arange(0, 10, 2)
print(arange) # 输出:[0 2 4 6 8]
(6) 均匀分布:np.linspace
- 语法:
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
num
:生成点的数量。endpoint
:是否包含终点。- 示例:
linspace = np.linspace(0, 1, 5)
print(linspace) # 输出:[0. 0.25 0.5 0.75 1. ]
3. 随机数数组
NumPy 的 np.random
模块生成随机数组。
- 均匀分布(0-1):
random = np.random.rand(2, 3) # 2x3 随机数
print(random) # 输出:随机值(如 [[0.12 0.45 0.67] [0.89 0.23 0.41]])
- 标准正态分布:
randn = np.random.randn(2, 3)
print(randn) # 输出:正态分布随机值
- 随机整数:
randint = np.random.randint(0, 10, size=(2, 3))
print(randint) # 输出:2x3 随机整数矩阵
4. 从现有数组创建
- 复制数组:
np.copy
arr = np.array([1, 2, 3])
copy = np.copy(arr)
print(copy) # 输出:[1 2 3]
- 从现有形状创建:
np.zeros_like
,np.ones_like
arr = np.array([[1, 2], [3, 4]])
zeros_like = np.zeros_like(arr)
print(zeros_like) # 输出:
# [[0 0]
# [0 0]]
5. 从文件加载
- 加载
.npy
文件:
arr = np.array([1, 2, 3])
np.save("array.npy", arr)
loaded = np.load("array.npy")
print(loaded) # 输出:[1 2 3]
- 加载文本文件:
data = np.loadtxt("data.txt", delimiter=",", dtype=np.float64)
三、创建数组的注意事项
- 数据类型(dtype):
- 默认类型可能因平台而异(如
int64
或int32
)。 - 显式指定
dtype
确保一致性:python arr = np.array([1, 2, 3], dtype=np.int16)
- 形状一致性:
- 输入数据形状需一致,否则报错:
python arr = np.array([[1, 2], [3]]) # 报错:不规则形状
- 内存效率:
- 大数组使用低精度类型(如
float32
、int8
)节省内存:python arr = np.zeros((1000, 1000), dtype=np.float32)
- 随机种子:
- 随机数生成时设置种子以确保可重复性:
python np.random.seed(42) print(np.random.rand(3)) # 输出固定随机值
- 视图 vs 副本:
- 某些创建方法(如
np.array(arr)
)可能返回视图,修改会影响原数组:python arr = np.array([1, 2, 3]) view = np.array(arr, copy=False) view[0] = 10 print(arr) # 输出:[10 2 3]
四、常见用法示例
1. 初始化矩阵
创建 3×3 零矩阵:
matrix = np.zeros((3, 3))
print(matrix)
2. 生成等差序列
生成从 0 到 100 的 5 个等间隔点:
points = np.linspace(0, 100, 5)
print(points) # 输出:[ 0. 25. 50. 75. 100.]
3. 随机数据
生成 2×3 随机整数矩阵:
rand_ints = np.random.randint(1, 10, size=(2, 3))
print(rand_ints)
4. 复制现有数组结构
复制形状并填充新值:
arr = np.array([[1, 2], [3, 4]])
new_arr = np.ones_like(arr) * 5
print(new_arr) # 输出:
# [[5 5]
# [5 5]]
5. 从 CSV 文件加载
data = np.genfromtxt("data.csv", delimiter=",", skip_header=1)
print(data)
五、最佳实践
- 显式指定
dtype
:
- 根据需求选择类型(如
int8
、float32
):python arr = np.array([1, 2, 3], dtype=np.int8)
- 检查数组属性:
- 创建后确认
shape
和dtype
:python print(arr.shape, arr.dtype)
- 优化内存:
- 大数组使用低精度类型:
python arr = np.zeros((1000, 1000), dtype=np.float16)
- 可重复随机数:
- 使用种子确保结果一致:
python np.random.seed(42)
- 避免不必要副本:
- 使用
copy=False
或视图操作:python arr = np.array([1, 2, 3], copy=False)
- 结构化输入:
- 确保输入数据形状一致:
python arr = np.array([[1, 2], [3, 4]]) # 规则形状
六、总结
NumPy 提供了多种创建 ndarray
的方法,包括从 Python 数据结构(np.array
)、内置函数(np.zeros
、np.ones
)、随机数(np.random
)和文件加载(np.load
)。掌握这些方法,并结合 dtype
和 shape
的灵活使用,能满足各种数据处理需求。遵循最佳实践(如指定类型、优化内存、检查属性),并注意形状一致性和视图行为,可提升代码效率和可靠性。
如果你需要更复杂的创建示例(如结构化数组、特定场景优化)或代码实现,请告诉我!