【问题标题】:Delete elements and rows from numpy arrays in a dict从字典中的numpy数组中删除元素和行
【发布时间】:2019-12-05 09:20:11
【问题描述】:

我有一本包含一维和二维 numpy 数组的字典。基于一个数组(此处为class_ids)的值,​​如果参考数组中的关联值与参考值不同(此处为3 )。我现在的字典是这样的

json = {'rois': array([[150, 340, 323, 437],
                       [230, 315, 361, 450],
                       [71, 136, 111, 152],
                       [68,  75, 101, 127],
                       [106, 264, 129, 273],
                       [70, 137, 109, 182]]),
        'class_ids': array([1,  2,  3,  3, 13,  3]),
        'scores': array([0.999424, 0.9991478, 0.98883635, 0.9819324,
                         0.85232574, 0.7136188], dtype=float32),
        'masks': array([[[False, False, False, False, False, False],
                         [False, False, False, False, False, False],
                         [False, False, False, False, False, False],
                         ...,
                         [False, False, False, False, False, False],
                         [False, False, False, False, False, False],
                         [False, False, False, False, False, False]],

                        [[False, False, False, False, False, False],
                         [
                            False, False, False, False, False, False],
                         [
                            False, False, False, False, False, False],
                         ...,
                         [
                            False, False, False, False, False, False],
                         [
                            False, False, False, False, False, False],
                         [False, False, False, False, False, False]],

                        [[False, False, False, False, False, False],
                         [
                            False, False, False, False, False, False],
                         [
                            False, False, False, False, False, False],
                         ...,
                         [
                            False, False, False, False, False, False],
                         [
                            False, False, False, False, False, False],
                         [False, False, False, False, False, False]],

                        ...,

                        [[False, False, False, False, False, False],
                         [
                            False, False, False, False, False, False],
                         [
                            False, False, False, False, False, False],
                         ...,
                         [
                            False, False, False, False, False, False],
                         [
                            False, False, False, False, False, False],
                         [False, False, False, False, False, False]],

                        [[False, False, False, False, False, False],
                         [
                            False, False, False, False, False, False],
                         [
                            False, False, False, False, False, False],
                         ...,
                         [
                            False, False, False, False, False, False],
                         [
                            False, False, False, False, False, False],
                         [False, False, False, False, False, False]],

                        [[False, False, False, False, False, False],
                         [
                            False, False, False, False, False, False],
                         [
                            False, False, False, False, False, False],
                         ...,
                         [
                            False, False, False, False, False, False],
                         [
                            False, False, False, False, False, False],
                         [False, False, False, False, False, False]]])}

预期输出

json = {'rois': array([[71, 136, 111, 152],
                       [68,  75, 101, 127],
                       [70, 137, 109, 182]]),
        'class_ids': array([3, 3, 3]),
        'scores': array([0.98883635, 0.9819324, 0.7136188], dtype=float32),
        'masks': array([[[False, False, False, False, False, False],
                         [False, False, False, False, False, False],
                         [False, False, False, False, False, False],
                         ...,
                         [False, False, False, False, False, False],
                         [False, False, False, False, False, False],
                         [False, False, False, False, False, False]],

                        [[False, False, False, False, False, False],
                         [False, False, False, False, False, False],
                         [False, False, False, False, False, False],
                         ...,
                         [False, False, False, False, False, False],
                         [False, False, False, False, False, False],
                         [False, False, False, False, False, False]],

                        [[False, False, False, False, False, False],
                         [False, False, False, False, False, False],
                         [False, False, False, False, False, False],
                         ...,
                         [False, False, False, False, False, False],
                         [False, False, False, False, False, False],
                         [False, False, False, False, False, False]]])}

我已尝试使用 np.delete 和 del json[class_ids][item],但出现此错误

ValueError: cannot delete array elements

【问题讨论】:

    标签: python numpy dictionary


    【解决方案1】:

    例如,您可以像这样实现您想要的

    import numpy as np
    
    dictNumpy = {'rois': np.arange(10).reshape(5, 2),
                 'id': np.array([1, 2, 3, 4, 3]),
                 'scores': np.arange(5),
                 'mask': np.arange(30).reshape(2, 3, 5)}
    refArr = dictNumpy['id']
    refVal = 3
    ind2rm = np.asarray(refArr != refVal).nonzero()[0]
    for key, value in dictNumpy.items():
        axis2rm = np.asarray(np.array(dictNumpy[key].shape)
                             == refArr.size).nonzero()[0][0]
        dictNumpy[key] = np.delete(value, ind2rm, axis=axis2rm)
    print(dictNumpy)
    

    打印出来

    {'rois': array([[4, 5],
           [8, 9]]), 'id': array([3, 3]), 'scores': array([2, 4]), 'mask': array([[[ 2,  4],
            [ 7,  9],
            [12, 14]],
    
           [[17, 19],
            [22, 24],
            [27, 29]]])}
    

    这里唯一的问题是,如果任何数组在其自己的形状中至少包含两次refArr.size。然后,只有关于数组的知识才能确定在 numpy.delete 的调用中要删除的正确轴。

    【讨论】:

    • 适用于 rois id 和 score,但适用于 mask dosnt 工作
    • 您介意提供json['masks'].shape的结果吗?
    • json['masks'].shape (447, 450, 6) 的结果,我的错误是 assert boxes.shape[0] == mask.shape[-1] == class_ids.shape [0] 断言错误
    • 谢谢,我已经更新了我的答案,这样事情就可以自动化了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 2021-02-24
    相关资源
    最近更新 更多