NumPy 创建数组

在 NumPy 中,创建数组是使用 ndarray(N 维数组)的基础操作。NumPy 提供了多种灵活的方式来创建数组,适用于不同的数据处理需求,如科学计算、数据分析和机器学习。以下是对 NumPy 创建数组的详细中文讲解,涵盖创建方法、示例、参数说明、注意事项及最佳实践,帮助你全面掌握 NumPy 数组的创建。


一、NumPy 数组创建概述

1. 为什么需要创建数组?

  • 定义:NumPy 的 ndarray 是多维、同类型的数据容器,优化了内存和计算性能。
  • 用途
  • 存储和操作多维数据(如向量、矩阵)。
  • 提供高效的数学运算和向量化操作。
  • 作为数据科学和机器学习的基础数据结构。
  • 优势
  • 比 Python 列表更快(C 实现,内存连续)。
  • 支持广播、切片和丰富的数学函数。
  • 与 Pandas、SciPy 等库无缝集成。

2. 基本概念

  • 数组类型ndarray 支持任意维数(1D、2D、3D 等)。
  • 数据类型(dtype):创建时可指定元素类型(如 int32float64)。
  • 形状(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)

三、创建数组的注意事项

  1. 数据类型(dtype)
  • 默认类型可能因平台而异(如 int64int32)。
  • 显式指定 dtype 确保一致性:
    python arr = np.array([1, 2, 3], dtype=np.int16)
  1. 形状一致性
  • 输入数据形状需一致,否则报错:
    python arr = np.array([[1, 2], [3]]) # 报错:不规则形状
  1. 内存效率
  • 大数组使用低精度类型(如 float32int8)节省内存:
    python arr = np.zeros((1000, 1000), dtype=np.float32)
  1. 随机种子
  • 随机数生成时设置种子以确保可重复性:
    python np.random.seed(42) print(np.random.rand(3)) # 输出固定随机值
  1. 视图 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)

五、最佳实践

  1. 显式指定 dtype
  • 根据需求选择类型(如 int8float32):
    python arr = np.array([1, 2, 3], dtype=np.int8)
  1. 检查数组属性
  • 创建后确认 shapedtype
    python print(arr.shape, arr.dtype)
  1. 优化内存
  • 大数组使用低精度类型:
    python arr = np.zeros((1000, 1000), dtype=np.float16)
  1. 可重复随机数
  • 使用种子确保结果一致:
    python np.random.seed(42)
  1. 避免不必要副本
  • 使用 copy=False 或视图操作:
    python arr = np.array([1, 2, 3], copy=False)
  1. 结构化输入
  • 确保输入数据形状一致:
    python arr = np.array([[1, 2], [3, 4]]) # 规则形状

六、总结

NumPy 提供了多种创建 ndarray 的方法,包括从 Python 数据结构(np.array)、内置函数(np.zerosnp.ones)、随机数(np.random)和文件加载(np.load)。掌握这些方法,并结合 dtypeshape 的灵活使用,能满足各种数据处理需求。遵循最佳实践(如指定类型、优化内存、检查属性),并注意形状一致性和视图行为,可提升代码效率和可靠性。

如果你需要更复杂的创建示例(如结构化数组、特定场景优化)或代码实现,请告诉我!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注