【发布时间】:2017-02-18 02:46:39
【问题描述】:
是否有一个 numpy 方法等效于 python 列表的内置 pop?
Popping 显然不适用于 numpy 数组,我想避免列表转换。
【问题讨论】:
-
pop 在 numpy 中不存在,根据设计,不建议模拟它。您最好在不使用流行模式的情况下接近您需要编写的算法
标签: python arrays list numpy stack
是否有一个 numpy 方法等效于 python 列表的内置 pop?
Popping 显然不适用于 numpy 数组,我想避免列表转换。
【问题讨论】:
标签: python arrays list numpy stack
重要的是它从原始数组中取出一个并将其删除。 如果你不 ind 单一方法的表面实现来完成这个过程,下面的代码会做你想做的。
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() 方法返回两个列表。第一个返回匹配元素的行索引,第二个返回列索引。这在搜索二维数组中的元素时很有用。在我们的例子中,第一个返回列表的第一个元素很有趣。
【讨论】:
这是一个使用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]])
【讨论】:
与 List 不同,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]
【讨论】:
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 方法,但您可以只使用基本切片(这会很有效,因为它返回的是视图,而不是副本):
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 可以将索引作为参数。这不行。