【问题标题】:Slicing by Array按数组切片
【发布时间】:2019-12-19 11:13:36
【问题描述】:

我有一个数组如下:

 A =
 [[  1.   2.   3.   0.   0.   0.   0.]
 [  4.   5.   6.   0.   0.   0.   0.]
 [  7.   8.   9.   0.   0.   0.   0.]
 [ 10.  11.  12.   0.   0.   0.   0.]
 [ 13.  14.  15.   0.   0.   0.   0.]
 [ 16.  17.  18.   0.   0.   0.   0.]
 [ 19.  20.  21.   0.   0.   0.   0.]
 [ 22.  23.  24.   0.   0.   0.   0.]
 [ 25.  26.  27.   0.   0.   0.   0.]
 [ 28.  29.  30.   0.   0.   0.   0.]
 [  0.   0.   0.   0.   0.   0.   0.]
 [  0.   0.   0.   0.   0.   0.   0.]
 [  0.   0.   0.   0.   0.   0.   0.]
 [  0.   0.   0.   0.   0.   0.   0.]]

我还有一个向量v=[10, 3],它告诉我需要在哪里切片才能获得左上角的子矩阵:

 A[0:v[0], 0:v[1]] = 
[[  1.   2.   3.]
 [  4.   5.   6.]
 [  7.   8.   9.]
 [ 10.  11.  12.]
 [ 13.  14.  15.]
 [ 16.  17.  18.]
 [ 19.  20.  21.]
 [ 22.  23.  24.]
 [ 25.  26.  27.]
 [ 28.  29.  30.]]

假设我现在有一个 n 维数组A_n,在它的左上角有一个子矩阵,就像上面的例子一样。同样,有一个向量 v_n 告诉我我的子矩阵的范围。

如何在不手动写入每个索引范围(即A_n[0:v_n[0], 0:v_n[1], 0:v_n[2] ...])的情况下使用向量对 n 维数组进行切片?

【问题讨论】:

    标签: python arrays numpy slice


    【解决方案1】:

    您可以通过映射构造slice 对象的元组(冒号表示基本上代表):

    A_n[<b>tuple(map(slice, V_n))</b>]

    所以如果V_n = [10, 3],我们就通过了:

    >>> tuple(map(slice, [10, 3]))
    (slice(None, 10, None), slice(None, 3, None))
    

    这基本上是[:10, :3] 含义的脱糖版本。

    【讨论】:

      【解决方案2】:

      我认为将A_n 转换为numpy 数组,然后使用列表推导对其进行切片就足够了:

      A_n = np.array(A_n)
      
      A_sliced = A_n[[slice(i) for i in v_n]]
      

      【讨论】:

        【解决方案3】:

        检查以下代码:

        A = [[1., 2., 3., 0., 0., 0., 0.], [4., 5., 6., 0., 0., 0., 0.], [7., 8., 9., 0., 0., 0., 0.],
             [10., 11., 12., 0., 0., 0., 0.], [13., 14., 15., 0., 0., 0., 0.], [16., 17., 18., 0., 0., 0., 0.],
             [19., 20., 21., 0., 0., 0., 0.], [22., 23., 24., 0., 0., 0., 0.], [25., 26., 27., 0., 0., 0., 0.],
             [28., 29., 30., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0., 0.],
             [0., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0., 0.]]
        n = [10,3]
        arrayA = []
        for i in range(0,n[0]):
            tempArray = []
            for j in range(0,n[1]):
                tempArray.append(j)
            arrayA.append(tempArray)
        print(arrayA)
        

        【讨论】:

          猜你喜欢
          • 2016-04-16
          • 2012-11-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-03-29
          • 2017-09-04
          • 2021-09-04
          • 2022-01-07
          相关资源
          最近更新 更多