#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. Массивы должны совпадать по количеству измерений.