代码之家  ›  专栏  ›  技术社区  ›  RPT

从三维numpy阵列中删除多个元素

  •  1
  • RPT  · 技术社区  · 8 年前

    我有一个3D阵列:

    array([[[ 0.61795117,  0.34560273],
            [ 0.60095554,  0.313913  ],
            [ 0.56190875,  0.27450137],
            [ 0.53021642,  0.26212656],
            [ 0.49034335,  0.25858353],
            [ 0.44450648,  0.26146402],
            [ 0.41882064,  0.26448245],
            [ 0.39206795,  0.26703482],
            [ 0.37275912,  0.27370546]],
    
           [[ 0.62495791,  0.3120504 ],
            [ 0.60739456,  0.2823137 ],
            [ 0.58004256,  0.25910831],
            [ 0.54361132,  0.25084742],
            [ 0.49346121,  0.24739456],
            [ 0.44806806,  0.24990211],
            [ 0.40776521,  0.25205095],
            [ 0.37056546,  0.256433  ],
            [ 0.34548124,  0.26043473]],
    
           [[ 0.65452639,  0.26129899],
            [ 0.62969364,  0.25388184],
            [ 0.59575798,  0.24279791],
            [ 0.56249134,  0.23879938],
            [ 0.50719102,  0.23659991],
            [ 0.4391442 ,  0.23682689],
            [ 0.39447801,  0.23831357],
            [ 0.35186027,  0.24433696],
            [ 0.31920393,  0.25020494]]])
    

    我有一个索引列表:

    [(0, 0),(0, 1),(0, 2),(0, 3),(0, 4),(0, 5),(0, 6),(0, 7),(0, 8),(1, 0),(1, 3),(1, 6),(2, 0),(1, 1)]
    

    我试图删除每个元组指向的3D数组中的行。

    我试过了,但没有成功

    np.delete(array, indexes, axis=0)
    

    有什么建议吗?

    2 回复  |  直到 8 年前
        1
  •  3
  •   Banana jqurious    8 年前

    可能不是最漂亮的解决方案,但您可以使用布尔索引(也就是说,如果这些列表总是具有与您显示的形状相似的形状)。我明确假设要删除的元素对应于此处大小为2的子阵列,然后:

    indices = [(0, 0),(0, 1),(0, 2),(0, 3),(0, 4),(0, 5),(0, 6),(0, 7),(0, 8),(1, 0),(1, 3),(1, 6),(2, 0),(1, 1)]
    ind = np.array(indices)
    idx = np.ones(arr.shape[0:2],dtype= bool) # here I assume the shape
    idx[ind[:,0],ind[:,1]] = False
    print(arr[idx])
    

    将打印所需的阵列

    编辑: 主要的问题是,即使有一个漂亮的面具

    indices = [(0, 0),(0, 1),(0, 2),(0, 3),(0, 4),(0, 5),(0, 6),(0, 7),(0, 8),(1, 0),(1, 3),(1, 6),(2, 0),(1, 1)]
    im,jm = zip(*indices)
    idx = np.ones_like(arr,dtype=bool)
    idx[im,jm] = False
    

    要取出的“行”数在第一个维度的不同条目中有所不同。首先,数组的维数为(3,7,2)。然后,沿着第一个维度,您希望删除所有3个子数组的不同行数,因此无法将其重塑为类似的形状(如(3,5,2)或其他形状)。我相信,这也是尝试在这里使用delete的主要问题。因此,即使您申请:

    newarr = arr[idx]
    

    数组将包含所需的元素,但将被展平。如果您可以制定一个规则来进行适当的重塑,例如,您总是知道最里面的数组(以及将被删除的数组)的大小,在本例2中,您可以使用掩码并执行以下操作

    newarr = arr[idx].reshape(-1,2)
    

    更一般的解决方案

        2
  •  0
  •   Pratik Kumar    8 年前

    为什么不转换数组 arr 首先进入列表,然后删除元素:

    a=arr.tolist()
    for i in indexes:
      x,y=i
      del(a[x][y])