> Some NumPy random number generation functions take a dtype parameter > whereas others don't. Some of them take an out parameter whereas others > don't. Just glancing at it, there seems to be no rhyme or reason why this > would be the case but is there some hidden consistency underneath the hood > to explain why some have these params and others don't? Is there any > reason that things like random.randn and numpy.random.Generator.normal > don't take a dtype and out parameters? If I need to create a huge array of > random numbers whose dtype is float16 or float32 then what is the BKM to do > this when the routine I would like to use generates an array of float64 and > with the 64-bit data type the array won't fit in memory? > > There is definitely inconsistency. The out keyword was added to a core set of floating generators as part of a feature request to the project that became Generator. The dtype argument was the same. integers already had dtype support so it was different from the core generators that have 32-bit implementations. The floating generators that have `dtype` support all use bit-efficient methods internally and so are not just `astype(np.float32)` wrappers around the double-precision implementations.
IMO a redesign of the internals would be needed to support `out` and `dtype`. There is an issue about rewriting variate construction functions as ufuncs so that one would get all of these for free. This would need a dedicated individual to undertake it since it would not be possible (as far as I know) to do this using Cython. This would also raise the maintenance bar for many users. Another possible approach would be to use C++ and templates now that this is moving into (slowly) mainstream. In the meantime, Generator is meant to be extensible using either compiled code (C/Cython) or JIT code (Numba), so that you can pretty easily produce fast, consistent generation code across a wide range of use cases. Finally as noted previously, all of the generators in the np.random namespace, which are methods of a RandomState object, are forever frozen in their API (per NEP, and also effectively frozen in implementation as well). The only place for changes is np.random.Generator (or any successor). Kevin
_______________________________________________ NumPy-Discussion mailing list -- numpy-discussion@python.org To unsubscribe send an email to numpy-discussion-le...@python.org https://mail.python.org/mailman3/lists/numpy-discussion.python.org/ Member address: arch...@mail-archive.com