Toutes les réponses ci-dessus sont comparables, mais si vous avez besoin d'utiliser une fonction personnalisée pour le mappage, et que vous disposez de numpy.ndarray
et vous devez conserver la forme du tableau.
Je n'en ai comparé que deux, mais il conservera la forme de l'objet. ndarray
. J'ai utilisé le tableau avec 1 million d'entrées à des fins de comparaison. J'utilise ici la fonction square. Je présente le cas général pour un tableau à n dimensions. Pour un tableau à deux dimensions, il suffit de faire iter
pour le 2D.
import numpy, time
def A(e):
return e * e
def timeit():
y = numpy.arange(1000000)
now = time.time()
numpy.array([A(x) for x in y.reshape(-1)]).reshape(y.shape)
print(time.time() - now)
now = time.time()
numpy.fromiter((A(x) for x in y.reshape(-1)), y.dtype).reshape(y.shape)
print(time.time() - now)
now = time.time()
numpy.square(y)
print(time.time() - now)
Sortie
>>> timeit()
1.162431240081787 # list comprehension and then building numpy array
1.0775556564331055 # from numpy.fromiter
0.002948284149169922 # using inbuilt function
Ici, vous pouvez voir clairement numpy.fromiter
fonction de carré d'utilisateur, utilisez celle de votre choix. Si votre fonction dépend de i, j
c'est-à-dire les indices du tableau, itérer sur la taille du tableau comme for ind in range(arr.size)
, utiliser numpy.unravel_index
pour obtenir i, j, ..
en fonction de votre indice 1D et de la forme du tableau numpy.unravel_index
Cette réponse est inspirée de ma réponse à une autre question. aquí