2016-10-09 17 views
6

Có phương pháp numpy tương đương với số dựng sẵn pop cho danh sách python không? popping rõ ràng là doenst làm việc trên mảng numpy, và tôi muốn tránh một danh sách chuyển đổi.python: numpy-equivalent của list.pop?

+0

pop không tồn tại và không được khuyến khích để mô phỏng nó. Bạn sẽ tiếp cận tốt hơn thuật toán bạn cần viết mà không cần sử dụng mẫu pop – Boud

Trả lời

8

Không có phương pháp pop cho mảng NumPy, nhưng bạn chỉ có thể sử dụng cắt cơ bản (mà sẽ hiệu quả vì nó trả về một quan điểm, không phải là một bản sao):

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

Nếu có một phương pháp pop nó sẽ trả về giá trị last trong y và sửa đổi y.

Ở trên,

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

gán giá trị cuối cùng để biến last và sửa đổi y.

2

đây là một trong numpy.delete() 's dụ:

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

Pop không tồn tại cho mảng NumPy, nhưng bạn có thể sử dụng NumPy lập chỉ mục kết hợp với chuyển dịch cơ cấu mảng, ví dụ hstack/vstack hoặc numpy.delete(), để mô phỏng popping.

Dưới đây là một số chức năng ví dụ tôi có thể nghĩ đến (mà dường như không hoạt động khi chỉ số là -1, nhưng bạn có thể khắc phục điều này với một điều kiện đơn giản):

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] 

này trả về mảng mà không hàng/cột bị xuất hiện, cũng như hàng/cột bị xuất hiện riêng biệt:

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