J'ai un ndarray de taille (M, N, 3). Il contient M x N points, dont chacun est identifié par ses coordonnées x, y et z. J'ai aussi une fonction «foo». 'foo' prend un point comme un ndarray de taille (, 3). Existe-t-il un moyen plus rapide d'appeler «foo» sur chacun des points M x N de mon tableau que d'utiliser deux boucles for imbriquées?

Jusqu'à présent, c'est ce que j'ai essayé. Mon tableau est la variable «sample_array».

num_rows = sample_array.shape[0]
num_columns = sample_array.shape[1]
solution = np.zeros((num_rows, num_columns))

for row in range(num_rows):
   for column in range(num_columns):
      point = sample_array[row, column]
      solution[row, column] = foo(point)

J'ai trouvé cette réponse, qui décrit l'utilisation de ces deux solutions:

np.vectorize(foo)
np.array(map(foo, sample_array))

Cependant, je ne sais pas comment spécifier que je ne veux pas que la fonction soit mappée à chacun des flotteurs M x N x 3. Au lieu de cela, je voudrais qu'il mappe la fonction à appeler sur chacun des ndarrays M x N (, 3).

Je vous remercie!

1
wingedNorthropi 2 juin 2020 à 23:32

4 réponses

Meilleure réponse

Vous pouvez essayer np.apply_along_axis(function, axis=2, arr=your_input_array) qui découpera le tableau le long du 3ème axe et appliquera la fonction à chaque tranche, c'est-à-dire point.

Trouvez le document ici np.apply_along_axis

1
CtrlMj 2 juin 2020 à 20:53

Idéalement, la fonction foo que vous appelez acceptera les tableaux en entrée. En général, il est judicieux pour toute fonction d'accepter tous les tableaux tant que la première dimension est celle attendue. Par exemple, la fonction

import numpy


def length(x):
    return numpy.sqrt(x[0] ** 2 + x[1] ** 2 + x[2] ** 2)

Calcule la longueur d'un vecteur, mais accepte également les tableaux de forme (3, ...) (peu importe le nombre de dimensions qui suivent) et fait ce qu'il faut.

Cette conception présente les avantages suivants:

0
Nico Schlömer 2 juin 2020 à 20:40

Une façon d'utiliser map est:

solution = np.array(list(map(foo, sample_array.reshape(-1,3)) ))\
             .reshape(sample_array.shape[:2])
0
Quang Hoang 2 juin 2020 à 20:58

En moins de lignes de code:

solution = np.vectorize(foo)(*sample_array.reshape(-1, 3).T)
0
panadestein 2 juin 2020 à 21:06