Python «Ошибка значения: невозможно удалить элементы массива» - Почему я это получаю? - PullRequest
2 голосов
/ 29 октября 2010

Мне не удалось найти что-либо об этой ошибке значения в Интернете, и я в полном недоумении, почему мой код вызывает этот ответ.

У меня большой словарь из 50 ключей. Значение, связанное с каждым ключом, является двумерным массивом множества элементов вида [datetime object, some other info]. Образец будет выглядеть так:

{'some_random_key': array([[datetime(2010, 10, 26, 11, 5, 28, 157404), 14.1],
                           [datetime(2010, 10, 26, 11, 5, 38, 613066), 17.2]],
                          dtype=object), 
'some_other_key':  array([[datetime(2010, 10, 26, 11, 5, 28, 157404), 'true'],
                          [datetime(2010, 10, 26, 11, 5, 38, 613066), 'false']], 
                         dtype=object)}

Я хочу, чтобы мой код позволял пользователю выбирать дату начала и окончания и удалять все элементы массива (для всех ключей), которые не входят в этот диапазон.

Поместив операторы print по всему коду, я смог сделать вывод, что он может находить даты, выходящие за пределы диапазона, но по какой-то причине ошибка возникает при попытке удалить элемент из массива.

Вот мой код:

def selectDateRange(dictionary, start, stop):

    #Make a clone dictionary to delete values from 
    theClone = dict(dictionary)

    starting = datetime.strptime(start, '%d-%m-%Y')   #put in datetime format
    ending   = datetime.strptime(stop+' '+ '23:59', '%d-%m-%Y %H:%M')    #put in datetime format 

    #Get a list of all the keys in the dictionary
    listOfKeys = theClone.keys()

    #Go through each key in the list
    for key in listOfKeys:
        print key 

        #The value associate with each key is an array
        innerAry = theClone[key]

        #Loop through the array and . . .
        for j, value in enumerate(reversed(innerAry)):

            if (value[0] <= starting) or (value[0] >= ending):
            #. . . delete anything that is not in the specified dateRange

                del innerAry[j]

    return theClone

Это сообщение об ошибке, которое я получаю:

ValueError: cannot delete array elements

и это происходит на линии: del innerAry[j]

Пожалуйста, помогите - возможно, у вас есть глаз, чтобы увидеть проблему, где я не могу.

Спасибо!

Ответы [ 2 ]

6 голосов
/ 12 ноября 2010

Если вы используете numpy массивы, то используйте их как массивы, а не как списки

numpy выполняет поэлементное сравнение для всего массива, который затем можно использовать для выбора соответствующего подмассива.Это также устраняет необходимость во внутреннем цикле.

>>> a = np.array([[datetime(2010, 10, 26, 11, 5, 28, 157404), 14.1],
                  [datetime(2010, 10, 26, 11, 5, 30, 613066), 17.2],
                  [datetime(2010, 10, 26, 11, 5, 31, 613066), 17.2],
                  [datetime(2010, 10, 26, 11, 5, 32, 613066), 17.2],
                  [datetime(2010, 10, 26, 11, 5, 33, 613066), 17.2],
                  [datetime(2010, 10, 26, 11, 5, 38, 613066), 17.2]],
                          dtype=object)
>>> start = datetime(2010, 10, 26, 11, 5, 28, 157405)
>>> end = datetime(2010, 10, 26, 11, 5, 33, 613066)

>>> (a[:,0] > start)&(a[:,0] < end)
array([False,  True,  True,  True, False, False], dtype=bool)
>>> a[(a[:,0] > start)&(a[:,0] < end)]
array([[2010-10-26 11:05:30.613066, 17.2],
       [2010-10-26 11:05:31.613066, 17.2],
       [2010-10-26 11:05:32.613066, 17.2]], dtype=object)

только для того, чтобы убедиться, что у нас еще есть время:

>>> b = a[(a[:,0] > start)&(a[:,0] < end)]
>>> b[0,0]
datetime.datetime(2010, 10, 26, 11, 5, 30, 613066)
3 голосов
/ 29 октября 2010

Массивы NumPy имеют фиксированный размер.Вместо этого используйте списки.

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