Код не будет работать при циклическом просмотре каталога: ошибка типа: диспетчер для __массива_функции__ не вернул повторяющийся

#python #pandas #numpy

Вопрос:

Я пытаюсь создать логический столбец («flag_rise»), который отмечает случаи, когда числа увеличиваются в другом столбце («Масштаб»), поэтому помечаю его как истинное, когда число больше, чем число перед ним. Код, который я написал, работает, когда я запускаю его в одном файле, но когда я пытаюсь запустить его через каталог, я получаю эту ошибку: ошибка типа: диспетчер для функции array_function не вернул итерацию. Я не могу найти много информации об этой ошибке в Интернете. Я дважды проверил файлы, запустив код для подмножества файлов, и получил ту же ошибку. Все файлы отформатированы одинаково. Любая помощь приветствуется.

Вот код:

 directory = os.chdir(r"directory")

# create list of files
dir_list = os.listdir(directory)

for file in dir_list:
    
    def rise (a):
        return np.concatenate((False),a[1:] > a[:-1])
    df['flag_rise'] = rise(df.Zoom.values)

 

Комментарии:

1. Бегство в Интернет, чтобы найти точное совпадение, работает с необычными ошибками, которые часто являются результатом несоответствия какой-либо последней версии. Но это не должно быть вашим первым шагом. Покажите полную обратную связь. Пока вы повторяете dir_list , код, который вы показываете, не используется file . Вы тестировали concatenate экспрессию в изоляции?

2. Как только вы определили, какое выражение вызывает проблему, вам следует проверить документы на наличие соответствующей функции. Убедитесь, что ваши аргументы соответствуют его ожиданиям!

Ответ №1:

concatenate ожидает список массивов (или, по крайней мере, an iterable ) в качестве первого аргумента. Второе должно быть целым числом, an axis .

 In [421]: np.concatenate((False),np.array([True, False]))
Traceback (most recent call last):
  File "<ipython-input-421-2e0a61c32e56>", line 1, in <module>
    np.concatenate((False),np.array([True, False]))
  File "<__array_function__ internals>", line 5, in concatenate
TypeError: dispatcher for __array_function__ did not return an iterable
 

Первый аргумент таков (False) . () здесь ничего не делает, это просто False , а не список, кортеж или другая итерация. Второй аргумент-это массив.

Изменение скобок для переноса обоих False и массива недостаточно, потому False что все еще является скалярным (или 0d-массивом):

 In [422]: np.concatenate([False,np.array([True, False])])
Traceback (most recent call last):
  File "<ipython-input-422-f6c715674042>", line 1, in <module>
    np.concatenate([False,np.array([True, False])])
  File "<__array_function__ internals>", line 5, in concatenate
ValueError: zero-dimensional arrays cannot be concatenated
 

Составьте False список, тогда это сработает:

 In [423]: np.concatenate([[False],np.array([True, False])])
Out[423]: array([False,  True, False])
 

concatenate преобразует все эти элементы списка в массивы:

 In [425]: np.array(False)
Out[425]: array(False)
In [426]: _.shape
Out[426]: ()
In [427]: __.ndim
Out[427]: 0
 

Он не может соединить массив фигур () с фигурой (2,) на оси 0. Массивы должны совпадать по количеству измерений.