是否存在 numpy 中等价于 Python 列表内置方法 pop
的方法?
在 numpy 数组上显然无法使用 pop,我想避免转换为列表。
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
的值。list.pop
可以接受一个索引作为参数。这样做是不可行的。 - Brambor以下是使用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]])
对于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])
与列表不同,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]
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]
在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数组中搜索元素时,这非常有用。在我们的情况下,第一个返回列表的第一个元素很有趣。
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
好的,既然我没有看到一个好的答案可以返回原始数组的第一个元素并将其从中删除,我编写了一个简单(虽然有点笨拙)的函数,利用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
np_array
和index
,并返回数组中给定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