【问题标题】:Numpy array indexing with a List: difference between arr[:][li] and arr[:,li]使用 List 进行 Numpy 数组索引:arr[:][li] 和 arr[:,li] 之间的区别
【发布时间】:2021-02-02 11:00:36
【问题描述】:

以下行为的解释是什么:

import numpy as np    
arr = np.zeros((3, 3))
li = [1,2]
print('output1:', arr[:, li].shape)
print('output2:', arr[:][li].shape)

>>output1: (3, 2)
>>output2: (2, 3)

我希望 output2 等于 output1。

【问题讨论】:

  • a[:] 只复制a。

标签: python arrays numpy indexing


【解决方案1】:

让我们使用一个不同的数组,这样更容易看出区别:

>>> arr = np.arange(9).reshape(3, 3)
>>> arr
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

第一种情况arr[:, li] 将选择第一个维度中的所有元素(在这种情况下为所有行),然后用[1, 2] 索引数组,这意味着只省略第一列:

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

因此,它的形状是 (3, 2)。

另一种情况arr[:] 将复制原始数组,因此它不会改变形状,因此它等效于arr[li],因此输出形状为(2, 3)。一般来说,您应该避免对数组进行双重索引,因为这可能会创建两次视图,这是低效的。

【讨论】:

    【解决方案2】:

    你得到了正确的输出。

    在第一行

    print('output1:', arr[:, li].shape)
    

    您正在打印arr 中每个子数组的2nd3rd 元素,从而得到每个包含2 值的3 元素。

    在第二行

    print('output2:', arr[:][li].shape)
    

    您首先选择整个数组,然后从整个数组中选择2nd3rd 元素(每个都包含3 元素本身),从而得到2 元素,每个元素都包含3 值。

    【讨论】:

      【解决方案3】:

      如果您检查此代码,可以看到差异 -

      import numpy as np    
      arr = np.arange(9).reshape(3, 3)
      li = [1,2]
      print('output1:', arr[:, li])
      print('output2:', arr[:][li])
      

      这给了 -

      [[1 2]
       [4 5]
       [7 8]]
      

      [[3 4 5]
       [6 7 8]]
      

      当您执行arr[:, [1, 2]] 时,您的意思是要获取数组的所有行(: 指定了这一点),然后从那里获取列[1, 2]

      另一方面,当您执行arr[:] 时,您首先指的是整个数组。您再次从中取出前两行。

      本质上,在第二种情况下,[1 2] 指的是原始数组的行轴,而在第一种情况下,它指的是列。

      【讨论】:

        猜你喜欢
        • 2020-10-14
        • 1970-01-01
        • 2011-04-27
        • 1970-01-01
        • 1970-01-01
        • 2015-01-06
        • 1970-01-01
        • 2020-07-10
        • 1970-01-01
        相关资源
        最近更新 更多