【问题标题】:Slicing arrays with lists使用列表切片数组
【发布时间】:2020-05-01 13:54:54
【问题描述】:

所以,我创建了一个 numpy 数组:

a = np.arange(25).reshape(5,5)

数组([[ 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]])

常规切片 a[1:3,1:3] 返回

数组([[ 6, 7], [11, 12]])

就像在第二个 a[1:3,[1,2]] 中使用列表一样

数组([[ 6, 7], [11, 12]])

但是,a[[1,2],[1,2]] 会返回

数组([ 6, 12])

显然我不明白这里的一些东西。也就是说,使用列表进行切片有时可能非常有用。

干杯,

【问题讨论】:

  • a[[1,2],[1,2]] 应该是 a[[1:2],[1:2]] 吗? a[1:3,[1,2]] 有错字吗?还是我误会了?

标签: python arrays slice


【解决方案1】:

您观察到所谓的Advanced Indexing 的影响。让我们考虑链接中的示例:

import numpy as np
x = np.array([[1, 2], [3, 4], [5, 6]])
print(x)
[[1 2]
 [3 4]
 [5 6]]
print(x[[0, 1, 2], [0, 1, 0]])  # [1 4 5]

您可能会认为这是提供网格的(笛卡尔)坐标列表,如

print(x[0,1])  # 1
print(x[1,1])  # 4
print(x[2,0])  # 5

【讨论】:

    【解决方案2】:

    它触发advanced indexing,所以第一个切片是行索引,第二个是列索引。对于每一行,它选择相应的列。

    a[[1,2], [1,2]] -> [a[1, 1], a[2, 2]] -> [6, 12]
    

    【讨论】:

      【解决方案3】:

      a[[1,2],[1,2]] 正在阅读此内容,我想要 a[1,1] 和 a[2,2]。有几种方法可以解决这个问题,我什至可能没有最好的方法,但你可以尝试

      a[[1,1,2,2],[1,2,1,2]]
      

      这将为您提供上述的扁平化版本

      a[[1,2]][:,[1,2]]
      

      这将为您提供正确的切片,它可以获取行 [1,2] 和列 [1,2]。

      【讨论】:

        【解决方案4】:

        在最后一种情况下,两个单独的列表被视为单独的索引操作(这真的很尴尬,所以请多多包涵)。

        Numpy 看到两个包含两个整数的列表,因此决定您需要两个值。每个值的行索引来自第一个列表,而每个值的列索引来自第二个列表。因此,您会得到a[1,1]a[2,2]: 符号不仅扩展到您准确推断的列表,而且还告诉 numpy 您想要该范围内的所有行/列。

        如果您提供手动管理的列表索引,它们的大小必须相同,因为每个/任何列表的大小是您将返回的元素数量。例如,如果您想要第 1、2、3 行的第 1 列和第 2 列中的元素:

        >>> a[1:4,[1,2]]
        array([[ 6,  7],
               [11, 12],
               [16, 17]])
        

        但是

        >>> a[[1,2,3],[1,2]]
        Traceback (most recent call last):
          File "<stdin>", line 1, in <module>
        IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (3,) (2,)
        

        前者告诉 numpy 你想要一系列的行和特定的列,而后者说“给我获取(1,1)(2,2)(3, hey! what the?! where's the other index?) 的元素”

        【讨论】:

          猜你喜欢
          • 2017-07-27
          • 1970-01-01
          • 1970-01-01
          • 2020-02-27
          • 2012-11-10
          • 1970-01-01
          • 2020-11-29
          • 2019-08-08
          • 2012-11-19
          相关资源
          最近更新 更多