NumPy repeat() 教程:高效重复数组元素的技巧 – wiki词典

My apologies. I used the unavailable write_file tool. My goal was to provide the article. Since I can’t create a new file, I’ll output the article content directly as my response.

NumPy repeat() 教程:高效重复数组元素的技巧

在数据处理和科学计算中,NumPy 是 Python 语言中不可或缺的库。它提供了强大的多维数组对象和一系列用于操作数组的函数。其中,numpy.repeat() 函数是用来高效重复数组元素的关键工具。本教程将深入探讨 numpy.repeat() 的用法、参数、常见场景以及与 numpy.tile() 的区别,帮助您更有效地利用它来处理数据。

什么是 numpy.repeat()

numpy.repeat() 函数用于重复数组中的元素。它可以根据指定的重复次数,将数组的每个元素或整个行/列重复多次,并返回一个新的数组。这个操作在数据扩展、特征工程、模式生成等多种场景中非常有用。

函数签名

python
numpy.repeat(a, repeats, axis=None)

参数说明:

  • a:输入数组。这是您希望重复元素的 NumPy 数组。
  • repeats:重复次数。
    • 如果是一个整数,则数组中的每个元素(或沿着指定轴的每个切片)都将重复相同的次数。
    • 如果是一个数组(array-like),它指定了 a 中每个元素(或沿着指定轴的每个切片)的重复次数。这个数组的长度必须与 a 在相应轴上的大小匹配(如果 axisNone,则与扁平化后的 a 的元素总数匹配)。
  • axis:轴。
    • 如果 axisNone (默认值),则输入数组 a 会首先被扁平化,然后每个元素都会被重复。
    • 如果 axis 是一个整数,它指定了沿着哪个轴进行重复操作。

基本用法和示例

1. 扁平化数组后重复 (axis=None)

axis 参数未指定时,numpy.repeat() 会将数组扁平化,然后重复每个元素。

“`python
import numpy as np

arr = np.array([[1, 2],
[3, 4]])
print(“原始数组:\n”, arr)

扁平化后,每个元素重复 3 次

repeated_arr = np.repeat(arr, 3)
print(“\n扁平化后每个元素重复 3 次:\n”, repeated_arr)

输出: [1 1 1 2 2 2 3 3 3 4 4 4]

“`

2. 沿着指定轴重复 (axis=0 或 axis=1)

通过指定 axis 参数,您可以控制重复操作是沿着行(axis=0)还是沿着列(axis=1)进行。

沿着 axis=0 (行) 重复:

“`python
import numpy as np

arr = np.array([[1, 2],
[3, 4]])
print(“原始数组:\n”, arr)

沿着 axis=0 (行) 重复,每行重复 2 次

repeated_axis0 = np.repeat(arr, 2, axis=0)
print(“\n沿着 axis=0 (行) 重复 2 次:\n”, repeated_axis0)

输出:

[[1 2]

[1 2]

[3 4]

[3 4]]

“`

沿着 axis=1 (列) 重复:

“`python
import numpy as np

arr = np.array([[1, 2],
[3, 4]])
print(“原始数组:\n”, arr)

沿着 axis=1 (列) 重复,每列重复 2 次

repeated_axis1 = np.repeat(arr, 2, axis=1)
print(“\n沿着 axis=1 (列) 重复 2 次:\n”, repeated_axis1)

输出:

[[1 1 2 2]

[3 3 4 4]]

“`

3. 使用不同的重复次数 (repeats 为数组)

repeats 参数也可以是一个数组,允许您为不同的元素或行/列指定不同的重复次数。

扁平化后使用不同的重复次数:

repeats 数组的长度必须与扁平化后的 a 的元素总数相同。

“`python
import numpy as np

arr = np.array([[1, 2],
[3, 4]])
print(“原始数组:\n”, arr)

为每个元素指定不同的重复次数 (扁平化顺序: 1, 2, 3, 4)

varying_repeats = [1, 3, 2, 1]
repeated_varying_counts = np.repeat(arr, varying_repeats)
print(“\n扁平化后使用不同重复次数:\n”, repeated_varying_counts)

输出: [1 2 2 2 3 3 4]

“`

沿着 axis=0 (行) 使用不同的重复次数:

repeats 数组的长度必须与 a 的行数相同。

“`python
import numpy as np

arr = np.array([[10, 20],
[30, 40],
[50, 60]])
print(“原始数组:\n”, arr)

第一行重复 1 次,第二行重复 3 次,第三行重复 2 次

varying_repeats_axis0 = [1, 3, 2]
repeated_varying_axis0 = np.repeat(arr, varying_repeats_axis0, axis=0)
print(“\n沿着 axis=0 使用不同重复次数:\n”, repeated_varying_axis0)

输出:

[[10 20]

[30 40]

[30 40]

[30 40]

[50 60]

[50 60]]

“`

沿着 axis=1 (列) 使用不同的重复次数:

repeats 数组的长度必须与 a 的列数相同。

“`python
import numpy as np

arr = np.array([[10, 20, 30],
[40, 50, 60]])
print(“原始数组:\n”, arr)

第一列重复 2 次,第二列重复 1 次,第三列重复 3 次

varying_repeats_axis1 = [2, 1, 3]
repeated_varying_axis1 = np.repeat(arr, varying_repeats_axis1, axis=1)
print(“\n沿着 axis=1 使用不同重复次数:\n”, repeated_varying_axis1)

输出:

[[10 10 20 30 30 30]

[40 40 50 60 60 60]]

“`

numpy.repeat()numpy.tile() 的区别

numpy.repeat()numpy.tile() 都用于扩展数组,但它们的工作方式截然不同:

  • numpy.repeat():重复数组中的 每个元素每个切片。它会根据 repeats 参数在原地插入重复项,从而改变数组的结构。

    • 示例np.repeat([1, 2], 2) -> [1, 1, 2, 2]
    • 特点:元素级重复,适用于需要扩展单个数据点或行/列的场景。
  • numpy.tile():重复 整个数组整个模式。它会将原始数组作为一个 “瓦片” 进行平铺,生成一个更大的数组。

    • 示例np.tile([1, 2], 2) -> [1, 2, 1, 2]
    • 特点:块级重复,适用于需要创建重复模式或填充矩阵的场景。

性能考量:

  • numpy.repeat():对于元素级别的重复,np.repeat() 通常非常高效,因为它底层使用 C 语言实现,可以利用高效的内存操作。
  • numpy.tile():对于块级别的重复,np.tile() 同样高效。

选择哪个函数取决于您想要进行哪种类型的重复:是重复每个单独的元素,还是重复整个数组的模式。

常见用例

  • 数据增强 (Data Augmentation):在机器学习中,您可能需要通过重复现有样本来增加数据集的大小,例如图像处理中重复像素行或列。
  • 特征工程 (Feature Engineering):创建新的特征时,可能需要重复某些特征值以匹配其他特征的维度。
  • 模式生成 (Pattern Generation):在创建特定的数据模式或掩码时,np.repeat() 可以方便地生成重复的数值序列。
  • 模拟 (Simulations):在 Monte Carlo 模拟中,可能需要重复初始条件或结果以进行多次运行。

总结

numpy.repeat() 是一个强大且灵活的函数,用于在 NumPy 数组中高效地重复元素。通过理解 repeatsaxis 参数,您可以精确控制重复行为,满足各种数据处理需求。与 numpy.tile() 结合使用时,这两个函数提供了构建和操作复杂数组结构的完整工具集。熟练掌握 numpy.repeat() 将极大地提升您在 Python 中进行科学计算和数据分析的效率。

滚动至顶部