给定的 numpy 代码中发生了什么。我对最后一行 print() 语句感到困惑

问题描述 投票:0回答:1

print() 语句将打印数组 X 的行??

    import numpy as np
    X = np.arange(12).reshape((3, 4))
    row = np.array([0, 1, 2])
    mask = np.array([1, 0, 1, 0], dtype=bool)
    print(X[row[:, np.newaxis], mask])
X = [[0, 1, 2, 3],
     [4, 5, 6, 7],
     [8, 9, 10, 11]]

row = [0, 1, 2]
mask = [True, False, True, False]

添加新轴后,数组行更改为二维数组。行的形状是 (3,1)

row = [[0],
       [1],
       [2]]

print()之后的结果 怎么办??

  [[0, 2],
   [4, 6],
   [8, 10]]
python numpy-ndarray numpy-slicing numpy-indexing
1个回答
0
投票

为了理解给定的 Python 代码及其生成的输出,让我们逐步分解该过程,重点关注所涉及的关键组件:NumPy 数组、索引和用于高级选择的形状操作。

1。 NumPy 数组创建

代码首先创建一个名为 X: 的 2D NumPy 数组:

X = np.arange(12).reshape((3, 4))

  • np.arange(12) 生成一个包含 0 到 11 之间数字的一维数组。
  • .reshape((3, 4)) 将此数组重塑为 3 行 4 列的 2D 数组:

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

2。索引数组

定义了两个附加数组:

  • row = np.array([0, 1, 2]) 指定行索引。
  • mask = np.array([1, 0, 1, 0], dtype=bool) 是用于选择列的布尔掩码。

由于 True 对应 1,False 对应 0,因此它实际上变为 [True, False, True, False],这意味着它将选择第一列和第三列并跳过第二列和第四列。

3.添加新轴

  • row[:, np.newaxis] 通过添加新轴将行从 1D 数组 ([0, 1, 2]) 转换为 2D 数组:

[[0], [1], [2]]

这种形状的变化对于下一步至关重要。

4。高级索引

表达式 X[row[:, np.newaxis], mask] 对 X: 执行高级索引

  • row[:, np.newaxis] 指示要选择哪些行,其 2D 形状允许广播。
  • mask 根据其布尔值选择列。

因为 row 已被重塑为 2D 数组,并且 mask 是 1D 布尔数组,所以 NumPy 广播它们以执行按元素选择。这意味着对于 row 指定的每一行,它选择 mask 为 True 的元素。

5。结果说明

最终输出为:

[[ 0,  2], [ 4,  6], [ 8, 10]]

以下是实现结果的方法:

  • 对于第一行 [0, 1, 2, 3],应用掩码 [True, False, True, False] 得到 [0, 2]。
  • 对于第二行 [4, 5, 6, 7],相同的掩码产生 [4, 6]。
  • 对于第三行 [8, 9, 10, 11],掩码结果再次为 [8, 10]。

因此,该操作从第一行选择元素 [0, 2],从第二行选择元素 [4, 6],从第三行选择元素 [8, 10],与指定的行索引和列掩码对齐。这展示了 NumPy 高级索引功能的强大方面,可以通过广播和布尔掩码实现复杂的选择。

© www.soinside.com 2019 - 2024. All rights reserved.