One explanation for this behavior is that doing otherwise would be slow.
Consider an array like
arr = np.array([1]*10**6 + [-1])
ret = np.log(arr)
Today, what happens is:
- The output array is allocated as np.double
- The input array is iterated over, and log evaluated on each element in
turn
For what you describe to happen, the behavior would have to be either:
- The output array is allocated as np.double
-
The input array is iterated over, and log evaluated on each element in
turn
-
If any negative element is encountered, allocate a new array as
np.cdouble, copy all the data over, then continue. This results in the
whole array being promoted.
or:
- The input array is iterated over, and checked to see if all the values
are positive
-
The output array is allocated as np.double or np.cdouble based on this
result
-
The input array is iterated over, and log evaluated on each element in
turn
In either case, you’ve converted a 1-pass iteration to a 2-pass one.
There are static-typing-based explanations for this behavior too, but I’ll
let someone else present one of those.
Eric
On Mon, 25 May 2020 at 14:33, Brian Racey
Why does numpy produce a runtime warning (invalid value encountered in log) when taking the log of a negative number? I noticed that if you coerce the argument to complex by adding 0j to the negative number, the expected result is produced (i.e. ln(-1) = pi*i).
I was surprised I couldn't find a discussion on this, as I would have expected others to have come across this before. Packages like Matlab handle negative numbers automatically by doing the complex conversion. _______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@python.org https://mail.python.org/mailman/listinfo/numpy-discussion