【问题标题】:Slicing arrays in Numpy / Scipy在 Numpy / Scipy 中切片数组
【发布时间】:2011-02-13 02:55:33
【问题描述】:

我有一个类似的数组:

a = array([[1,2,3],[3,4,5],[4,5,6]])

从其中切出一个只有前两列“a”的 1x2 数组的最有效方法是什么?

array([[2,3],[4,5],[5,6]]) in this case.

【问题讨论】:

  • 您的 Q "1x2" 中的示例结果如何...?它是如何拥有 first 两列的?我一定很困惑……
  • @Alex:看到结果我希望他指的是最后两列 :) 和 1x2 ......好吧。有 2 个元素的 3 个数组,你可以这样看 ;) 你完全正确,+1

标签: python numpy scipy


【解决方案1】:

这就是你要找的吗?

a[:,1:]

【讨论】:

    【解决方案2】:

    二维 numpy 数组使用a[i,j](不是a[i][j])进行索引,但是您可以对 numpy 数组和矩阵使用与 python 中的普通矩阵相同的切片符号(只需将它们放在单个 @987654323 @):

    >>> 从 numpy 导入数组 >>> a = 数组([[1,2,3],[3,4,5],[4,5,6]]) >>> a[:,1:] 数组([[2, 3], [4, 5], [5, 6]])

    【讨论】:

    • 这条规则是否只适用于二维数组?
    • @IvanBalashov 不,您也可以将其用于更高的维度。
    【解决方案3】:

    引用documentation,基本切片语法是i:j:k,其中i是起始索引,j是停止索引,k是步骤(当k > 0时)。

    现在如果没有给出i,如果k > 0 则默认为0。否则,i 默认为 n - 1 for k < 0(其中 n 是数组的长度)。

    如果没有给出j,则默认为n(数组长度)。

    这是一个一维数组。

    现在二维数组是不同的野兽。其切片语法为a[rowrange, columnrange]

    因此,如果您想要所有行,但只想要最后两列,就像您的情况一样,您可以这样做:

    a[0:3, 1:3]
    

    这里,“[0:3]”表示从 0 到 3 的所有行。“[1:3]”表示从第 1 列到第 3 列的所有列。

    现在您可能想知道,即使您只有 3 列并且编号从 1 开始,它也必须返回 3 列,对吗?即:第 1 列、第 2 列、第 3 列

    这是这个语法的棘手部分。第一列实际上是第 0 列。因此,当您说“[1:3]”时,您实际上是在说给我第 1 列和第 2 列。这是您想要的最后两列。 (实际上没有第 3 列。)

    现在,如果您不知道矩阵有多长或者想要所有行,则可以将该部分留空。 即

    a[:, 1:3]
    

    列也一样。也就是说,如果你想说,除了第一行之外的所有列,你会写

    a[0:1,:]
    

    现在,上面的答案a[:,1:] 是如何工作的,因为当您对列说“[1:]”时,这意味着给我除了第 0 列之外的所有内容,直到所有列的末尾。即空意味着“直到最后”。

    现在你必须意识到逗号两边的任何东西都是我上面第一次提到的一维情况的子集。也就是说,如果你想使用步长来指定你的行,你可以写

    a[::2,1]
    

    在你的情况下会返回

    array([[2, 3],
           [5, 6]])
    

    a[::2,1] 解释为:每隔一行给我,从最上面开始,只给我第二列。

    我花了一些时间才弄清楚。所以把它粘贴在这里,以防万一它对某人有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      • 2020-12-11
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      相关资源
      最近更新 更多