【问题标题】:Indexing 2d array with 2d array in Numpy在 Numpy 中用二维数组索引二维数组
【发布时间】:2020-07-30 04:58:14
【问题描述】:

我有一个问题困扰了我好几天。 假设我们在 Numpy 中定义了一个二维数组:

x = np.array([[0, 1, 2],
              [3, 4, 5],
              [6, 7, 8]])

我们还定义了一个用于索引的一维数组,比方说:

ind = np.array([2,1])

如果我们尝试x[ind],我们会得到:

array([[6, 7, 8],
       [3, 4, 5]])

这很有意义:x 的第 2 行和第 1 行。

如果我们运行:x[:,ind],我们将得到:

array([[2, 1],
       [5, 4],
       [8, 7]])

同样,这很有意义 - 我们收到第 2 列,然后是第 1 列

现在我们将索引数组定义为 2d:

ind = np.array([[2,1],
                [2,2]])

如果我们运行x[ind],我们会得到:

array([[[6, 7, 8],
        [3, 4, 5]],

       [[6, 7, 8],
        [6, 7, 8]]])

同样,这是有道理的 - 对于索引二维数组中的每一行,我们都会收到一个二维数组,它表示原始二维数组 x 中的相应行。

但是,如果我们运行 x[:,ind],我们会收到下一个数组:

array([[[2, 1],
        [2, 2]],

       [[5, 4],
        [5, 5]],

       [[8, 7],
        [8, 8]]])

我不明白这个输出,因为它返回索引行中的特定项目,而不是完整的行。我会假设,就像x[:,ind] 是一维数组时的情况一样,我们将收到二维数组,其中包含来自原始x 数组的原始列。

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    在索引数组的最后一种情况下:

    print(ind)
    array([[2, 1],
           [2, 2]])
    

    由于ind 是一个2D 形状为(2,2) 的数组,并且您沿第一个轴截取完整的切片,使用ind,您将在其每个轴上沿A 的列进行索引行。因此,例如通过使用ind 索引第二行[3, 4, 5],您将再次获得索引2->51->42->52->5 处的元素,结果形状与@ 相同987654333@,所以[[5,4][5,5]]

    其每一行都相同,从而产生(3,2,2) 形状的数组。

    【讨论】:

    • 为什么切片只在每行的列上而不是在整列上,就像我提出的二维数组一样?
    • 因为在第一种情况下,您沿第一个轴切片。请注意,x[ind] 与 x[ind,:] 相同。因此,除非您通过沿前面的轴 (x[:,ind]) 获取完整切片来指定它@lirand,否则您将沿第一个轴进行索引:x[first_axis_ixs, secoind_axis_ixs, ...]
    • 有意义@lirand ?
    • 我不太确定 - 如果我使用 x[:,ind] 我希望对于 2d 数组中的每个索引我会得到一个完整的列,即 ind[0,0] ( 2) 我们将得到 [2,5,8].T,对于 ind[0,1] (1),我们将得到 [1,4,7].T。对于 ind[1,1] 和 ind[1,2](第二行),我们将得到 [2,5,8] 和 [2,5,8] 因此输出将是两个 3x2 数组。
    • 没有。它不是那样工作的。这是因为您正在为每一行的列编制索引,所以您只能沿着每行中的值获取索引。你会用x.T[ind]@lirand 得到这个结果
    猜你喜欢
    • 2012-04-10
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 2019-07-28
    • 1970-01-01
    相关资源
    最近更新 更多