web-dev-qa-db-fra.com

python: numpy-equivalent de list.pop?

Y at-il une méthode numpy qui équivaut à la construction dans les pop pour les listes de python? popping ne fonctionne évidemment pas sur les tableaux numpy, et je veux éviter une conversion de liste.

10
Anton Alice

Il n'y a pas de méthode pop pour les tableaux NumPy, mais vous pouvez simplement utiliser le découpage en tranches de base (ce qui serait efficace car il renvoie une vue et non une copie):

In [104]: y = np.arange(5); y
Out[105]: array([0, 1, 2, 3, 4])

In [106]: last, y = y[-1], y[:-1]

In [107]: last, y
Out[107]: (4, array([0, 1, 2, 3]))

S'il existait une méthode pop, elle renverrait la valeur last dans y et modifierait y.

Au dessus de, 

last, y = y[-1], y[:-1]

assigne la dernière valeur à la variable last et modifie y.

10
unutbu

Voici un exemple en utilisant numpy.delete() :

import numpy as np
arr = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
print(arr)
#  array([[ 1,  2,  3,  4],
#         [ 5,  6,  7,  8],
#         [ 9, 10, 11, 12]])
arr = np.delete(arr, 1, 0)
print(arr)
# array([[ 1,  2,  3,  4],
#        [ 9, 10, 11, 12]])
4
mozlingyu

Le pop n'existe pas pour les tableaux NumPy, mais vous pouvez utiliser l'indexation NumPy en combinaison avec la restructuration du tableau, par exemple hstack/vstack ou numpy.delete (), pour émuler le popping.

Voici quelques exemples de fonctions auxquelles je peux penser (qui, apparemment, ne fonctionnent pas lorsque l'index est -1, mais vous pouvez résoudre ce problème avec un simple conditionnel):

def poprow(my_array,pr):
    """ row popping in numpy arrays
    Input: my_array - NumPy array, pr: row index to pop out
    Output: [new_array,popped_row] """
    i = pr
    pop = my_array[i]
    new_array = np.vstack((my_array[:i],my_array[i+1:]))
    return [new_array,pop]

def popcol(my_array,pc):
    """ column popping in numpy arrays
    Input: my_array: NumPy array, pc: column index to pop out
    Output: [new_array,popped_col] """
    i = pc
    pop = my_array[:,i]
    new_array = np.hstack((my_array[:,:i],my_array[:,i+1:]))
    return [new_array,pop]

Ceci retourne le tableau sans la ligne/colonne sautée, ainsi que la ligne/colonne sautée séparément: 

>>> A = np.array([[1,2,3],[4,5,6]])
>>> [A,poparow] = poprow(A,0)
>>> poparow
array([1, 2, 3])

>>> A = np.array([[1,2,3],[4,5,6]])
>>> [A,popacol] = popcol(A,2)
>>> popacol
array([3, 6])
1
dbouz