2016-10-09 2 views
6

Есть ли метод numpy, который эквивалентен встроенному pop для списков python? по-видимому, doenst работает на массивах numpy, и я хочу избежать преобразования списка.python: numpy-эквивалент list.pop?

+0

Поп не существует в numpy и по дизайну не рекомендуется эмулировать его. Вы бы лучше подошли к алгоритму, который вам нужно написать, не используя поп-паттерн – Boud

ответ

8

Там нет pop метода NumPy массивов, но вы могли бы просто использовать базовую нарезку (что было бы эффективным, поскольку он возвращает представление, а не копия):

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])) 

Если бы были pop метода его возвратит значение last в y и изменит y.

Выше

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

присваивает последнее значение переменной last и изменяет y.

2

это один из примера numpy.delete() «s:

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]]) 
np.delete(arr, 1, 0) 
print(arr) 
# array([[ 1, 2, 3, 4], 
#  [ 9, 10, 11, 12]]) 
0

Поп не существует для NumPy массивов, но вы можете использовать NumPy индексирование в сочетании с реструктуризацией массива, например hstack/vstack или numpy.delete(), чтобы эмулировать выскакивание.

Вот некоторые примеры функции я могу думать (что, по-видимому, не работает, когда индекс -1, но вы можете исправить это с помощью простого условного):

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] 

Это возвращает массив без выскочившая строка/столбец, а также всплывающая строка/столбец отдельно:

>>> 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]) 
Смежные вопросы