The np.fromfunction(lambda i, j: i == j, (3, 3), dtype=int)
call works perfectly and results in an array for which .dtype
returns dtype('bool')
.
However, if I explicitly specify dtype=bool
in the function call, I get the following error:
ValueError: no fill-function for data-type.
What is the reason for that?
CodePudding user response:
It needs to construct the coordinates for the (3,3)
array, this cant be done when the array is of dtype=bool
.
Under the hood it calls np.arange(...,dtype=bool)
, which cant be done, resulting in this exact error.
CodePudding user response:
fromfunction
just does:
args = indices(shape, dtype=dtype)
return function(*args, **kwargs)
dtype
is passed to indices
. It has nothing to do with the result returned by your function
.
np.indices
does
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 "<ipython-input-355-75b7ff9469d4>", line 1, in <module>
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.
See the error in arange
?
Making a matrix like [354] doesn't make sense for bool
, does it?
Look again at the fromfunction
docs:
dtype : data-type, optional
Data-type of the coordinate arrays passed to `function`.
By default, `dtype` is float.
dtype
is for the coordinates passed to function
, not the result of function
.
edit
At the risk of being redundant, here's the full traceback when using your code
Traceback (most recent call last):
File "<ipython-input-358-dfc87db48bcc>", line 1, in <module>
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.
Pay attention to each calling level - fromfunction
, indices
, arange
.