Удалить строки из массива записей, если выполнены условия - PullRequest
0 голосов
/ 03 декабря 2018

Я хочу удалить строки из повторного массива, если выполнено условие:

Вот что я пробовал:

for i in range(0, len(data)):
    if 270 <= data['l'][int(i)] <= 350 and -20 <= data['b'][int(i)] <= 20:
        np.delete(data, data[int(i)])

Однако я получаю:

ValueError: Can't cast from structure to non-structure, except if the structure only has a single field.

Существует ли (в идеале быстрый) способ удаления строк из массива, если выполняются несколько условий?

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Судя по вашему коду, тест работал нормально, но .delete выглядел как проблема.Вот пример:

        import numpy as np
        import random

        np.set_printoptions(threshold=np.nan)
        dtype_arr = []
        x_range_upper_limit = 12
        y_range = "abcdefghijklm"
        for letter in y_range: # abcdefghijklmnopqrstuvwxyz
            dtype_arr.append((letter, 'int'))
        data = np.recarray((x_range_upper_limit,),dtype=dtype_arr)
        for letter in range(0,x_range_upper_limit):
            for i in y_range:
                data[letter][i]=random.randint(1,101)
        print ("data length:{}".format(len(data)))
        # ensure a row to delete
        data['l'][3] = 280
        data['b'][3] = 10
        # test code
        print (data)
        list_of_rows_to_delete = []
        for i in range(0, x_range_upper_limit):
            if 270 <= data['l'][i] <= 350 and -20 <= data['b'][i] <= 20:
                list_of_rows_to_delete.append(i)
        print ("list of rows to delete: {}".format(list_of_rows_to_delete))
        data=np.delete(data, list_of_rows_to_delete)
        print (len(data))
        print (data)

Вывод:

        data length:12
        [(74, 14,  53, 54, 99, 35, 31, 88, 49,  8, 50,   8, 30)
        (26, 11,   4, 47, 84, 88, 73, 55, 58, 61, 68, 101, 58)
        (64, 33,   7, 82, 32, 44,  1, 34, 47, 60, 38,  56, 17)
        (87, 10,  24, 71, 54, 49, 73, 42, 86,  1, 70, 280, 55)
        (87, 80, 100, 97,  9, 41, 99, 51, 97, 13, 46,  81, 34)
        (72, 18,  88, 14, 42, 98, 50, 10, 70, 35, 33,  31, 18)
        (59, 53,  98, 22, 50, 14, 29, 84, 27, 70, 90,   7, 58)
        (47, 26,  27, 48, 79, 37, 97, 64, 64, 59, 15,  52, 32)
        (62, 75,  85, 36, 38, 53, 33, 98, 54,  2, 33,   9, 21)
        (81, 97,  96, 58, 40, 50, 32,  4, 94,  9, 16,  79, 50)
        (75, 66,  90, 29, 94, 48, 44, 28, 41, 18, 45,  65, 50)
        (20, 60,  25, 69, 40, 90, 99, 79, 30,  8, 23,  27, 25)]
        list of rows to delete: [3]
        11
        [(74, 14,  53, 54, 99, 35, 31, 88, 49,  8, 50,   8, 30)
        (26, 11,   4, 47, 84, 88, 73, 55, 58, 61, 68, 101, 58)
        (64, 33,   7, 82, 32, 44,  1, 34, 47, 60, 38,  56, 17)
        (87, 80, 100, 97,  9, 41, 99, 51, 97, 13, 46,  81, 34)
        (72, 18,  88, 14, 42, 98, 50, 10, 70, 35, 33,  31, 18)
        (59, 53,  98, 22, 50, 14, 29, 84, 27, 70, 90,   7, 58)
        (47, 26,  27, 48, 79, 37, 97, 64, 64, 59, 15,  52, 32)
        (62, 75,  85, 36, 38, 53, 33, 98, 54,  2, 33,   9, 21)
        (81, 97,  96, 58, 40, 50, 32,  4, 94,  9, 16,  79, 50)
        (75, 66,  90, 29, 94, 48, 44, 28, 41, 18, 45,  65, 50)
        (20, 60,  25, 69, 40, 90, 99, 79, 30,  8, 23,  27, 25)]
0 голосов
/ 03 декабря 2018

Простой ответ на простой вопрос, получается:

Я просил число <270 И> 350, что, конечно, невозможно!Используйте оператор или!

 datam[(datam['l'] < 270) | (datam['l'] > 350) | (datam['b'] < -20) | (datam['b'] > 20)] 

Это почти мгновенно превысило 8 миллионов точек данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...