Могу ли я указать numpy dtype при генерации случайных значений?

Я создаю массив случайных значений numpy и добавляю их к существующему массиву, содержащему 32-битные поплавки. Я хотел бы генерировать случайные значения, используя тот же тип dtype, что и целевой массив, так что мне не нужно преобразовывать типы dtypes вручную. В настоящее время я делаю это:

import numpy as np

x = np.zeros((10, 10), dtype='f')
x += np.random.randn(*x.shape).astype('f')

То, что я хотел бы сделать вместо последней строки, выглядит примерно так:

x += np.random.randn(*x.shape, dtype=x.dtype)

но randn (и фактически ни один из методов numpy.random) не принимает аргумент dtype.

Мой конкретный вопрос в том, можно ли указать dtype для случайных чисел, когда я их создаю, без вызова astype? (Мое предположение, что генератор случайных чисел имеет длину 64 бит, поэтому на самом деле не имеет смысла это делать, но я думал, что спрошу, возможно ли это.)

Ответ 1

Q: можно указать dtype для случайных чисел, когда я их создаю.

A: Нет, это не так. randn принимает форму только как randn (d0, d1,..., dn)

Просто попробуйте следующее:

x = np.random.randn(10, 10).astype('f')

Или определите новую функцию, например

np.random.randn2 = lambda *args, **kwarg: np.random.randn(*args).astype(kwarg.get('dtype', np.float64))
x = np.random.randn2(10, 10, dtype='f')

Если вам нужно использовать свой код в сообщении, попробуйте этот код вместо

x = np.zeros((10, 10), dtype='f')
x[:] = np.random.randn(*x.shape)

Это присваивает результаты randn памяти, выделенной np.zeros

Ответ 2

Позвольте мне начать с того, что numpy теперь поддерживает dtypes для случайных целых чисел. Это улучшение можно отслеживать с помощью Issue # 6790 в numpy github. Но на сегодняшний день это средство недоступно для gaussian RNG. Мне нужен был тот же объект, поэтому я написал этот патч для numpy, https://gist.github.com/se4u/e44f631b249e0be03c21c6c898059176

Патч только добавляет поддержку для генерации значений float и не обрабатывает другие типы данных, но может быть полезен кому-то.