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 <race...@gmail.com> wrote: > 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 >
_______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@python.org https://mail.python.org/mailman/listinfo/numpy-discussion