2014-04-29 12 views
12

Sto creando un array numpy di valori casuali e li aggiungo a un array esistente contenente float a 32 bit. Mi piacerebbe generare i valori casuali usando lo stesso dtype dell'array di destinazione, in modo da non dover convertire manualmente i dtype. Attualmente faccio questo:Posso specificare un dtype numpy durante la generazione di valori casuali?

import numpy as np 

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

Quello che mi piacerebbe fare, invece dell'ultima riga è qualcosa di simile:

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

ma randn (e in realtà nessuno dei metodi numpy.random) non accetta un Argomento dtype.

La mia domanda specifica è, è possibile specificare un dtype per i numeri casuali quando li creo, senza dover chiamare astype? (La mia ipotesi è che il generatore di numeri casuali sia lungo 64 bit, quindi non ha senso farlo, ma ho pensato di chiedere se è possibile.)

+2

numpy converte automaticamente il tipo di array casuale nel tipo di 'x' quando si esegue l'operazione sul posto, non c'è assolutamente bisogno di' astype', semplicemente 'x + = np.random.randn (* x.shape) ', e vedi da te che' x.dtype' non cambia. – Jaime

risposta

14

Q: è possibile specificare un dtype per i numeri casuali quando li creo.

A: No, non lo è. randn accetta la forma solo come randn (d0, d1, ..., dn)

Semplicemente provare questo:

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

o definire una nuova funzione come

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

Se devi usare il tuo codice sul post, prova questo codice invece

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

Questo assegna i risultati di randn nella memoria allocata da np.zeros

+0

questo non funziona per il caso di scalari (ad esempio randn()) perché randn restituirà un tipo numerico float, non un array - altrimenti, in pratica quello che ho fatto anch'io –

+0

Questo non sembra funzionare per .astype ('i ') in quanto fornisce una matrice con tutti gli elementi come 0. – 2324

2

Lasciatemi iniziare dicendo che numpy ora supporta i dtypes per numeri casuali. Questo miglioramento può essere monitorato tramite Issue #6790 su github di numpy. Ma ad oggi, questa funzione non è disponibile per il gaussian RNG. Avevo bisogno di questa stessa funzione così ho scritto questa patch per numpy, https://gist.github.com/se4u/e44f631b249e0be03c21c6c898059176

La patch aggiunge solo il supporto per la generazione di valori float e non gestisce altri tipi di dati, ma potrebbe essere comunque utile a qualcuno.

Problemi correlati