【问题标题】:Query about picking values from numpy array查询从 numpy 数组中取值
【发布时间】:2020-11-04 13:21:20
【问题描述】:

我有一个 numpy 形状的数组 (206, 482, 3)。我想选择第一个频道,所以我使用了name_of_array[:][:][0],但显然这并没有选择第一个频道。

我认为name_of_array[:,:,0] 选择了第一个频道。我不明白为什么。为什么是name_of_array[:][:][0] != name_of_array[:,:,0]

【问题讨论】:

    标签: python numpy numpy-slicing


    【解决方案1】:

    了解每件事的作用很重要。要做到这一点,从左到右分解动作。也许重写会使这一点更清楚:

    x[:][:][0] -> ( ( x[:] )[:] )[0]  # Both are valid and equivalent Python syntax
    

    所以基本上,我们将[:] 应用于x,然后将[:] 应用于结果,然后将[0] 应用于此结果。 x[:] 是什么?只需返回x 的副本!因此

    ( (x[:])[:] )[0] == ( (x)[:] )[0] == (x[:])[0] == x[0]
    

    这当然不是您所期望的。另一方面,

    x[:, :, 0]
    

    立即返回所有帧的所有行的 0 列(我将索引视为 [frame, row, col])。

    【讨论】:

      【解决方案2】:

      简短的回答:因为那是语法(请参阅Numpy basics indexing)。

      arr[:]       == arr # full slice of all dimensions of the array 
      arr[:][:]    == arr # full slice of a full slice of all dimensions 
      arr[:][:][0] == arr # equal to arr[0] because the first 2 [:] slice all
      

      arr[:,:,0]  # slice all of 1st dim, slice all of 2nd dim, get 0th of 3rd arr
      

      你自己想出这样的事情的一种方法是做一个简化的例子和实验(注意How to debug small programs):

      import numpy as np
      
      res = np.arange(4 * 3 * 2).reshape(4,3,2)
      
      
      print(":,:,:")
      print(res[:, :, :])  
      
      print("\n1:2,1:2,:")
      print(res[1:2, 1:2, :])
      
      print("\n:,:,0")
      print(res[:, :, 0])
      
      print("\n:,:,1")
      print(res[:,:,1])
      

      输出:

      # :,:,:   == all of it  
      [[[ 0  1]
        [ 2  3]
        [ 4  5]]
      
      [[ 6  7]
        [ 8  9]
        [10 11]]
      
      [[12 13]
        [14 15]
        [16 17]]
      
      [[18 19]
        [20 21]
        [22 23]]]
      
      # 1:2,1:2,:
      [[[8 9]]]
      
      # :,:,0
      [[ 0  2  4]
      [ 6  8 10]
      [12 14 16]
      [18 20 22]]
      
      # :,:,1
      [[ 1  3  5]
      [ 7  9 11]
      [13 15 17]
      [19 21 23]]
      

      在 SO 上有很多关于 的问题,其中一些值得研究以提高您的知识(被认为可能是骗子,但他们没有正确解决混淆问题):

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-30
        • 2013-09-05
        • 1970-01-01
        • 2021-06-03
        • 1970-01-01
        • 1970-01-01
        • 2012-03-08
        • 2019-06-24
        相关资源
        最近更新 更多