返回

告别繁琐!NumPy多维数组切片通用方法大揭秘

python

多维 NumPy 数组切片的通用方法

简介

NumPy 是一个强大的 Python 库,用于处理多维数组。当我们处理这些数组时,我们经常需要使用切片来提取特定维度的数据。对于具有固定维度的数组,我们可以手动指定切片索引。但是,对于具有任意维度的数组,这个过程变得繁琐且容易出错。

问题:任意维度数组的繁琐切片

为了解决这个问题,NumPy 提供了 ellipsis (...) 符号。它充当占位符,表示所有未显式指定的维度。这简化了切片,让我们能够以通用且鲁棒的方式提取任意维度数组中的数据。

解决方案:ellipsis(...)符号

要使用 ellipsis 符号,只需在切片索引中将其放在你想要省略的维度之前即可。例如,以下切片将提取三维数组中最后一个维度中的 i-th 索引:

slice = myarray[..., i]

这等同于:

slice = myarray[:, :, :, i]

优势

使用 ellipsis 符号进行多维数组切片具有以下优势:

  • 简化: 它简化了任意维度数组的切片,消除了手动指定维度索引的需要。
  • 灵活性: 它可以用于具有任何数量维度的数组。
  • 鲁棒性: 它不受数组维度变化的影响。

使用示例

以下代码示例演示了如何在具有不同维度的 NumPy 数组上使用 ellipsis 符号:

import numpy as np

# 三维数组
arr_3d = np.arange(24).reshape(2, 3, 4)
print(arr_3d)

# 使用 ellipsis 提取最后一个维度中的索引 2
slice_3d = arr_3d[..., 2]
print(slice_3d)

# 四维数组
arr_4d = np.arange(48).reshape(2, 3, 4, 2)
print(arr_4d)

# 使用 ellipsis 提取最后一个维度中的索引 1
slice_4d = arr_4d[..., 1]
print(slice_4d)

输出:

[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
[ 2  6 10 14 18 22]
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]
  [12 13 14 15]]

 [[16 17 18 19]
  [20 21 22 23]
  [24 25 26 27]
  [28 29 30 31]]]
[[ 1  3  5  7  9 11 13 15 17 19 21 23 25 27 29 31]]

常见问题解答

  1. 我可以将 ellipsis 符号用于一维数组吗?

    • 不,ellipsis 符号仅适用于多维数组。
  2. ellipsis 符号是否总是放在切片索引的最后?

    • 不,ellipsis 符号必须放在你想要省略的维度之前。
  3. ellipsis 符号是否会影响数组的维度?

    • 不,ellipsis 符号不会更改数组的维度。
  4. 如何在多维切片中使用多个 ellipsis 符号?

    • 可以在一个切片中使用多个 ellipsis 符号,前提是它们分别放置在要省略的不同维度之前。
  5. ellipsis 符号是否支持负索引?

    • 不,ellipsis 符号不支持负索引。