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:
np.doublelog evaluated on each element in turnFor what you describe to happen, the behavior would have to be either:
np.doubleThe 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 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
_______________________________________________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