从3-D numpy数组中删除多个元素

时间:2018-02-02 17:53:13

标签: python-3.x python-2.7 list numpy multidimensional-array

我有一个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 个答案:

答案 0 :(得分:2)

可能不是最漂亮的解决方案,但您可以使用布尔索引(即,如果这些列表的形状与您显示的相似)。我明确假设您要删除的元素对应于此处大小为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)或其他)。这也是尝试在这里使用删除的主要问题,我相信。所以即使你申请:

newarr = arr[idx]

数组将包含您想要的元素,但将被展平。如果你可以制定一个正确的整形规则,例如你总是知道最里面的数组的大小(那些将被删除的那些),在这种情况下是2,你可以使用掩码并做

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

获得更通用的解决方案

答案 1 :(得分:0)

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

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