web-dev-qa-db-fra.com

Décompressez le tableau NumPy par colonne

Si j'ai un tableau NumPy, par exemple 5x3, existe-t-il un moyen de le décompresser colonne par colonne en une seule fois pour passer à une fonction plutôt que comme ceci: my_func(arr[:, 0], arr[:, 1], arr[:, 2])?

Un peu comme *args pour le déballage de la liste mais par colonne.

19
jeff_new

Vous pouvez décompresser la transposition du tableau afin d'utiliser les colonnes pour vos arguments de fonction:

my_func(*arr.T)

Voici un exemple simple:

>>> x = np.arange(15).reshape(5, 3)
array([[ 0,  5, 10],
       [ 1,  6, 11],
       [ 2,  7, 12],
       [ 3,  8, 13],
       [ 4,  9, 14]])

Écrivons une fonction pour ajouter les colonnes ensemble (normalement fait avec x.sum(axis=1) dans NumPy):

def add_cols(a, b, c):
    return a+b+c

Ensuite nous avons:

>>> add_cols(*x.T)
array([15, 18, 21, 24, 27])

Les tableaux NumPy seront décompressés le long de la première dimension, d'où la nécessité de transposer le tableau.

25
Alex Riley

numpy.split divise un tableau en plusieurs sous-tableaux. Dans ton cas, indices_or_sections est 3 car vous avez 3 colonnes et axis = 1 puisque nous divisons par colonne.

my_func(numpy.split(array, 3, 1))
11
Stephanie

Je suppose que numpy.split Ne suffira pas à l'avenir. Au lieu de cela, il devrait être

my_func(Tuple(numpy.split(array, 3, 1)))

Actuellement, python affiche l'avertissement suivant:

FutureWarning: L'utilisation d'une séquence non-Tuple pour l'indexation multidimensionnelle est déconseillée; utilisez arr[Tuple(seq)] au lieu de arr[seq]. À l'avenir, cela sera interprété comme un index de tableau, arr[np.array(seq)], ce qui entraînera soit une erreur, soit un résultat différent.

1
CookieMaster