【问题标题】:Advanced Integer slicing when slicing object is an ndarray tuple切片对象是 ndarray 元组时的高级整数切片
【发布时间】:2018-06-20 19:40:01
【问题描述】:

我明白了

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

输出给出y= [1 4 5] 这只是将第一个列表作为行和第二个列表和列。

但是下面是如何工作的呢?

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

rows = np.array([[0,0],[3,3]])
cols = np.array([[0,2],[0,2]]) 
y = x[rows,cols] 

这给出了输出:

[[ 0  2]                                                                      
 [ 9 11]] 

您能否解释一下使用 ndarrays 作为切片对象时的逻辑?为什么它对行和列都有一个二维数组。当切片对象是 ndarray 而不是 python 列表时,规则有何不同?

【问题讨论】:

    标签: python numpy matrix multidimensional-array numpy-indexing


    【解决方案1】:

    我们有以下数组x

    x = np.array([[1, 2], [3, 4], [5, 6]] 
    

    而索引[0, 1, 2][0, 1, 0] 在索引到x 时就像

    x[[0,1,2], [0,1,0]] 
    

    给了

    [1,  4,  5]
    

    我们使用的索引基本上可以转换为:

    [0, 1, 2] & [0, 1, 0] --> [0,0], [1,1], [2,0]
    

    由于我们使用一维列表作为索引,我们得到一维数组作为结果。


    有了这些知识,让我们看看下一个案例。现在,我们将数组 x 设为:

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

    现在索引是二维数组。

    rows = np.array([[0,0],[3,3]])
    cols = np.array([[0,2],[0,2]]) 
    

    这当索引到数组x 时就像:

    x[rows,cols] 
    

    简单翻译为:

    [[0,0],[3,3]]
      | |   | |      ====> [[0,0]], [[0,2]], [[3,0]], [[3,2]]
    [[0,2],[0,2]]
    

    现在,很容易观察到这 4 个 list of list 在索引到数组 x 时如何给出以下结果(即这里它只是从我们的数组 x 返回 角元素 ):

    [[ 0,  2]                                                                      
     [ 9, 11]]
    

    请注意,在这种情况下,我们将结果作为二维数组(与第一种情况下的一维数组相反),因为我们的索引 rowscolumns 本身是二维数组(即等效于 list of list),而在在第一种情况下,我们的索引是一维数组(或等效的简单 list,没有任何嵌套)。

    因此,如果您需要二维数组作为结果,则需要将二维数组作为索引。

    【讨论】:

    • 谢谢!你用通俗的语言解释 x[rows, cols] 让我的生活更轻松。
    【解决方案2】:

    了解这一点的最简单方法是以下观察:输出的形状由索引数组的形状决定,或者更准确地说,由将所有索引数组广播在一起产生的形状决定。

    这样看:你有一个给定形状的数组A 和另一个形状的数组V,你想用来自V 的值填充A。你需要指定什么?好吧,对于A 中的每个位置,您需要指定V 中某些元素的坐标。因此,如果V 是 ND,您需要 N 个与A 形状相同的索引数组,或者至少可以广播。然后通过将这些索引数组放在[] 表达式中的坐标位置来索引V

    【讨论】:

      【解决方案3】:

      为了简单起见,我们将保持 2D 并假设 rows.shape = cols.shape。 (你可以通过广播打破这条规则,但现在我们不会)。我们将这个形状称为(I, J)

      那么y = x[rows, cols] 等同于:

      y = np.empty((I, J))
      for i in range(I):
          for j in range(J):
              y[i, j] = x[rows[i, j], cols[i, j]]
      

      【讨论】:

        猜你喜欢
        • 2019-01-29
        • 1970-01-01
        • 2021-11-17
        • 2016-12-28
        • 1970-01-01
        • 2012-11-10
        • 2020-08-07
        • 1970-01-01
        • 2013-06-25
        相关资源
        最近更新 更多