Oggi ho definito una funzione e ho trovato (almeno a me) un collo di bottiglia strano: Creazione di un array mascherato con mask=None
o mask=0
per inizializzare una maschera con tutti gli zeri, ma la stessa forma del data
è molto lento:Perché la creazione di un array numpy mascherato è così lento con mask = None o mask = 0
>>> import numpy as np
>>> data = np.ones((100, 100, 100))
>>> %timeit ma_array = np.ma.array(data, mask=None, copy=False)
1 loop, best of 3: 803 ms per loop
>>> %timeit ma_array = np.ma.array(data, mask=0, copy=False)
1 loop, best of 3: 807 ms per loop
d'altra parte utilizzando mask=False
o la creazione della maschera a mano è molto più veloce:
>>> %timeit ma_array = np.ma.array(data, mask=False, copy=False)
1000 loops, best of 3: 438 µs per loop
>>> %timeit ma_array = np.ma.array(data, mask=np.zeros(data.shape, dtype=bool), copy=False)
1000 loops, best of 3: 453 µs per loop
Perché sta dando None
o 0
quasi 2000 volte più lento di False
o np.zeros(data.shape)
come parametro mask
? Dato che l'function docs dice solo che:
deve essere convertibile in un array di booleani con la stessa forma di dati. True indica un dato mascherato (cioè non valido).
Io uso python 3.5, NumPy 1.11.0 su Windows 10
Hai già scavato nel codice di Numpy? –