#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]])