返回
告别繁琐!NumPy多维数组切片通用方法大揭秘
python
2024-03-18 09:20:04
多维 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]]
常见问题解答
-
我可以将 ellipsis 符号用于一维数组吗?
- 不,ellipsis 符号仅适用于多维数组。
-
ellipsis 符号是否总是放在切片索引的最后?
- 不,ellipsis 符号必须放在你想要省略的维度之前。
-
ellipsis 符号是否会影响数组的维度?
- 不,ellipsis 符号不会更改数组的维度。
-
如何在多维切片中使用多个 ellipsis 符号?
- 可以在一个切片中使用多个 ellipsis 符号,前提是它们分别放置在要省略的不同维度之前。
-
ellipsis 符号是否支持负索引?
- 不,ellipsis 符号不支持负索引。