Dans une grande base de code, j'utilise np.broadcast_to
pour diffuser des tableaux (nous n'utilisons ici que des exemples simples) :
In [1]: x = np.array([1,2,3])
In [2]: y = np.broadcast_to(x, (2,1,3))
In [3]: y.shape
Out[3]: (2, 1, 3)
Ailleurs dans le code, j'utilise des fonctions tierces qui peuvent opérer de manière vectorielle sur des tableaux Numpy mais qui ne sont pas des ufuncs. Ces fonctions ne comprennent pas la diffusion, ce qui signifie qu'appeler une telle fonction sur des tableaux tels que y
est inefficace. Des solutions comme celle de Numpy vectorize
ne sont pas bonnes non plus car, bien qu'elles comprennent la radiodiffusion, elles introduisent une for
boucle sur les éléments du tableau, ce qui est alors très inefficace.
Idéalement, j'aimerais pouvoir disposer d'une fonction que l'on pourrait appeler par exemple unbroadcast
qui renvoie un tableau avec une forme minimale qui peut être retransmise à la taille complète si nécessaire. Ainsi, par exemple
In [4]: z = unbroadcast(y)
In [5]: z.shape
Out[5]: (1, 1, 3)
Je peux alors exécuter les fonctions tierces sur z
puis diffuse le résultat à l'adresse suivante y.shape
.
Existe-t-il un moyen de mettre en œuvre unbroadcast
qui s'appuie sur l'API publique de Numpy ? Sinon, existe-t-il des astuces qui permettraient d'obtenir le résultat souhaité ?