Исправление:
arr1=[[19],[29],[ 0],[11],[ 1],[86],[90],[28],[23],[31],[39],[96],[82],[17],[71],[39],[ 8],[97]]
d
:
{9: 0, 19: 1, 29: 2, 39: 3, 49: 4, 59: 5, 69: 6, 79: 7, 89: 8, 99: 9}
Ошибка, при полная обратная связь , составляет:
Traceback (most recent call last):
File "stack53618793.py", line 8, in <module>
arr2 = np.vectorize(d.get)(arr1)
File "/usr/local/lib/python3.6/dist-packages/numpy/lib/function_base.py", line 1972, in __call__
return self._vectorize_call(func=func, args=vargs)
File "/usr/local/lib/python3.6/dist-packages/numpy/lib/function_base.py", line 2051, in _vectorize_call
res = array(outputs, copy=False, subok=True, dtype=otypes[0])
TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'
С n=8
d
равно {8: 0, 18: 1, 28: 2, 38: 3, 48: 4, 58: 5, 68: 6, 78: 7, 88: 8, 98: 9}
.arr2
имеет много None
, потому что это значение по умолчанию для get
.
vectorize
выполняет тестовый расчет с первым элементом arr1
и использует результат для установки возврата dtype
.
С n=8
, get(19)
возвращает None
, поэтому dtype возврата имеет значение object
.
С n=9
, get(19)
возвращает целое число 1
(он находится в d
), поэтому возвращаемый тип dtype - int
.Это приводит к ошибке, когда другой get
возвращает None
.
Одним из исправлений является установка otypes
.
arr2 = np.vectorize(d.get, otypes=[object])(arr1)
Другой возможностью является замена get
на `get (
arr2 = np.vectorize(lambda x: d.get(x,10))(arr1)
Тогда вам не нужен шаг None
замены.
Этот векторизация get
, вероятно, не самый быстрый способ сделать эту замену. Но если вы делаетеиспользуйте vectorize
, вам нужно следить за такими ловушками, как это автоматическое otypes
.
Когда вы спрашиваете об ошибке, вы должны включить full traceback или, по крайней мере,достаточно, чтобы мы точно знали, где происходит ошибка. Для меня это было неочевидно, пока я не запустил тестовый пример.