【问题标题】:Delete multiple elements from a 3-D numpy array从 3-D numpy 数组中删除多个元素
【发布时间】:2018-07-13 06:54:56
【问题描述】:

我有一个 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)

有什么建议吗?

【问题讨论】:

  • 你想要像 delete (0,0) 这样的东西应该只删除 [ 0.61795117, 0.34560273] 而没有别的吗?
  • 是的,基本上是给定 x 和 y 轴上的行

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


【解决方案1】:

可能不是最漂亮的解决方案,但您可以使用布尔索引(也就是说,如果这些列表始终具有与您显示的内容相似的形状)。我在这里明确假设你要删除的元素对应大小为 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】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多