Почему NumPy возвращает «нет функции заполнения для типа данных», когда массив создается с помощью dtype=bool?

#numpy

#тупица

Вопрос:

np.fromfunction(lambda i, j: i == j, (3, 3), dtype=int) Вызов работает идеально и приводит к массиву, для которого .dtype возвращается dtype('bool') значение .

Однако, если я явно укажу dtype=bool в вызове функции, я получу следующую ошибку:

Ошибка значения: нет функции заполнения для типа данных.

В чем причина этого?

Ответ №1:

Ему нужно построить координаты для (3,3) массива, это невозможно сделать, когда массив имеет dtype=bool .

Под капотом он вызывает np.arange(...,dtype=bool) , что не может быть сделано, что приводит именно к этой ошибке.

Ответ №2:

fromfunction просто делает:

 args = indices(shape, dtype=dtype) return function(*args, **kwargs)  

dtype передается indices в. Это не имеет никакого отношения к результату, возвращенному вами function .

np.indices делает

 for i, dim in enumerate(dimensions):  idx = arange(dim, dtype=dtype).reshape(  shape[:i]   (dim,)   shape[i 1:]  )  In [354]: np.indices((3,3)) Out[354]:  array([[[0, 0, 0],  [1, 1, 1],  [2, 2, 2]],   [[0, 1, 2],  [0, 1, 2],  [0, 1, 2]]]) In [355]: np.indices((3,3),dtype=bool) Traceback (most recent call last):  File "lt;ipython-input-355-75b7ff9469d4gt;", line 1, in lt;modulegt;  np.indices((3,3),dtype=bool)  File "/usr/local/lib/python3.8/dist-packages/numpy/core/numeric.py", line 1772, in indices  idx = arange(dim, dtype=dtype).reshape( ValueError: no fill-function for data-type.  

Видите ошибку в arange ?

Создание матрицы , подобной [354], не имеет смысла bool , не так ли?

Посмотрите еще раз на fromfunction документы:

 dtype : data-type, optional  Data-type of the coordinate arrays passed to `function`.  By default, `dtype` is float.  

dtype это для переданных координат function , а не для результата function .

Редактировать

Рискуя быть излишним, вот полная обратная связь при использовании вашего кода

 Traceback (most recent call last):  File "lt;ipython-input-358-dfc87db48bccgt;", line 1, in lt;modulegt;  np.fromfunction(lambda i, j: i == j, (3, 3), dtype=bool)  File "/usr/local/lib/python3.8/dist-packages/numpy/core/numeric.py", line 1845, in fromfunction  args = indices(shape, dtype=dtype)  File "/usr/local/lib/python3.8/dist-packages/numpy/core/numeric.py", line 1772, in indices  idx = arange(dim, dtype=dtype).reshape( ValueError: no fill-function for data-type.  

Обратите внимание на каждый уровень вызова — fromfunction , indices , arange .

снова

fromfunction создает иллюзию того, что вы делаете что-то значительное, но, как видно из начальной цитаты, она просто генерирует a indices и передает их вашей функции.

Ваш пример можно было бы так же легко выполнить с помощью пары транслируемых arange :

 In [359]: np.fromfunction(lambda i, j: i == j, (3, 3), dtype=int) Out[359]:  array([[ True, False, False],  [False, True, False],  [False, False, True]]) In [360]: np.arange(3)[:,None]==np.arange(3) Out[360]:  array([[ True, False, False],  [False, True, False],  [False, False, True]])