代码之家  ›  专栏  ›  技术社区  ›  ninja.coder

Numpy搜索和切片3D阵列

  •  2
  • ninja.coder  · 技术社区  · 7 年前

    我对Python非常陌生&Numpy和我正在努力实现以下目标:

    给定3D阵列:

    arr_3d = [[[1,2,3],[4,5,6],[0,0,0],[0,0,0]],
              [[3,2,1],[0,0,0],[0,0,0],[0,0,0]]
              [[1,2,3],[4,5,6],[7,8,9],[0,0,0]]]
    arr_3d = np.array(arr_3d)
    
    1. 获取索引,其中 [0,0,0] 显示在给定的三维阵列中。
    2. 从以下位置切片给定的三维阵列 [0,0,0] 首先显示。

    换句话说,我正在尝试删除填充(在本例中: [0,0,0] )从给定的3D阵列。

    这是我试过的,

    arr_zero = np.zeros(3)
    for index in range(0, len(arr_3d)):
        rows, cols = np.where(arr_3d[index] == arr_zero)
        arr_3d[index] = np.array(arr_3d[0][:rows[0]])
    

    但这样做,我不断得到以下错误:

    无法从形状广播输入数组。。。进入形状。。。

    我期待着这样的事情:

    [[[1,2,3],[4,5,6]],
     [[3,2,1]]
     [[1,2,3],[4,5,6],[7,8,9]]]
    

    任何帮助都将不胜感激。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Divakar    7 年前

    使用 all() 减少伴随 argmax() 然后将每个切片 2D 切掉 3D 阵列-

    In [106]: idx = (arr_3d == [0,0,0]).all(-1).argmax(-1)
    
    # Output as list of arrays
    In [107]: [a[:i] for a,i in zip(arr_3d,idx)]
    Out[107]: 
    [array([[1, 2, 3],
            [4, 5, 6]]), array([[3, 2, 1]]), array([[1, 2, 3],
            [4, 5, 6],
            [7, 8, 9]])]
    
    # Output as list of lists
    In [108]: [a[:i].tolist() for a,i in zip(arr_3d,idx)]
    Out[108]: [[[1, 2, 3], [4, 5, 6]], [[3, 2, 1]], [[1, 2, 3], [4, 5, 6], [7, 8, 9]]]