numpy中类似于list.pop()的函数是什么?

63

是否存在 numpy 中等价于 Python 列表内置方法 pop 的方法?

在 numpy 数组上显然无法使用 pop,我想避免转换为列表。


1
在numpy中并不存在pop函数,而且按照设计,不建议模拟它。你最好不要使用pop模式来编写所需的算法。 - Zeugma
10个回答

34

NumPy数组没有pop方法,但你可以直接使用基本切片(这是高效的,因为它返回一个视图而不是副本):

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 方法,它会返回 y 中的 last 值并修改 y

上面的内容:

last, y = y[-1], y[:-1]
将最后一个值分配给变量last并修改y的值。

5
但是,list.pop可以接受一个索引作为参数。这样做是不可行的。 - Brambor
你能解释一下这个吗? l1=[10,11,12,13,14,16,17,18] [l1.pop(l1.index(i)) for i in l1 if i%2==0] print("l1:",l1) 输出 - l1: [11, 13, 16, 17] - sameer_nubia

23

以下是使用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]])

6
pop 返回列表中的值,并使列表变短。 - parvij

8

对于NumPy数组,不存在pop函数,但是可以使用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])

6

与列表不同,numpy数组中没有pop()方法,以下是一些替代方案:

  • 使用基本切片
>>> x = np.array([1,2,3,4,5])
>>> x = x[:-1]; x
>>> [1,2,3,4]
  • 或者,通过使用 delete() 函数。

语法 - np.delete(arr, obj, axis=None)

arr: 输入的数组
obj: 要删除的行或列编号
axis: 要删除的轴

>>> x = np.array([1,2,3,4,5])
>>> x = x = np.delete(x, len(x)-1, 0)
>>> [1,2,3,4]

3
重要的是,它从原始数组中取出一个并将其删除。 如果您不介意使用一个简单的方法来完成此过程,则以下代码将达到您想要的效果。
import numpy as np

a = np.arange(0, 3)
i = 0
selected, others = a[i], np.delete(a, i)

print(selected)
print(others)

# result:
# 0
# [1 2]

2

在Numpy中检索和删除随机项的最“优雅”解决方案是:

import numpy as np
import random

arr = np.array([1, 3, 5, 2, 8, 7])
element = random.choice(arr)
elementIndex = np.where(arr == element)[0][0]
arr = np.delete(arr, elementIndex)

对于好奇的编程者:

np.where() 方法返回两个列表。第一个列表返回匹配元素的行索引,第二个列表返回列索引。当在2d数组中搜索元素时,这非常有用。在我们的情况下,第一个返回列表的第一个元素很有趣。


0

unutbu 对此有一个简单的答案, 但是pop()也可以接受一个索引作为参数。以下是您如何使用numpy复制它:

pop_index = 4
pop = y[pop_index]
y = np.concatenate([y[:pop_index],y[pop_index+1:]])

0
要补充一点,如果你想在一个numpy的二维数组中实现对行或列进行pop操作,可以这样做:
col = arr[:, -1] # gets the last column
np.delete(arr, -1, 1) # deletes the last column

并且对于行:

row = arr[-1, :] # gets the last row
np.delete(arr, -1, 0) # deletes the last row

-1

好的,既然我没有看到一个好的答案可以返回原始数组的第一个元素并将其从中删除,我编写了一个简单(虽然有点笨拙)的函数,利用global来处理一维数组(多维数组需要进行修改):

tmp_array_for_popfunc = 1d_array

def array_pop():
    global tmp_array_for_popfunc
    
    r = tmp_array_for_popfunc[0]
    tmp_array_for_popfunc = np.delete(tmp_array_for_popfunc, 0)
    return r

使用以下代码进行检查 -

print(len(tmp_array_for_popfunc)) # confirm initial size of tmp_array_for_popfunc
print(array_pop()) #prints return value at tmp_array_for_popfunc[0]
print(len(tmp_array_for_popfunc)) # now size is 1 smaller

我很好奇,为什么要使用全局变量而不是将“1d_array”作为参数传递? - Bernd Wechner
免责声明:我不是专家,所以可能存在错误。 如果我们没有将原始数组(1d_array)作为全局变量进行操作,在函数中对传递的数组所做的任何更改由于作用域问题都不会“停留”下来。 非全局的方法需要额外的步骤来返回修改后的数组,然后覆盖原始数组。因此没有真正的弹出函数。你可以试试看。 我记得在 C 语言中,我们不需要使用全局变量,而是可以将指向原始数组的指针传递给函数,然后所有对原始数组的修改都会“停留”,但我不知道如何在 Python 中实现这一点。 - Saqster
正确的回答方式是说:没有现成的 POPs,你应该先自己实现一个。 - Ash

-1
我创建了一个函数,它几乎做了同样的事情。这个函数有两个参数:np_arrayindex,并返回数组中给定index的值。
def np_pop(np_array, index=-1):
    '''
    Pop the "index" from np_array and return the value. 
    Default value for index is the last element.
    '''
    # add this to make sure 'numpy' is imported 
    import numpy as np
    # read the value of the given array at the given index
    value = np_array[index]
    # remove value from array
    np.delete(np_array, index, 0)
    # return the value
    return value

请记住,您可以添加条件以确保所给的索引存在于数组中,如果出现任何问题,请返回-1

现在,您可以像这样使用它:

import numpy as np
i = 2 # let's assume we want to pop index number 2
y = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]) # assume 'y' is our numpy array 
poped_val = np_pop(y, i) # value of the piped index

没有弹出窗口。这就是答案。 - Ash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接