list.pop 的 numpy 等效项?
Posted
技术标签:
【中文标题】list.pop 的 numpy 等效项?【英文标题】:numpy-equivalent of list.pop? 【发布时间】:2017-02-18 02:46:39 【问题描述】:是否有一个 numpy 方法等效于 python 列表的内置 pop
?
Popping 显然不适用于 numpy 数组,我想避免列表转换。
【问题讨论】:
pop 在 numpy 中不存在,根据设计,不建议模拟它。您最好在不使用流行模式的情况下接近您需要编写的算法 【参考方案1】:重要的是它从原始数组中取出一个并将其删除。 如果你不 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]
【讨论】:
【参考方案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() 方法返回两个列表。第一个返回匹配元素的行索引,第二个返回列索引。这在搜索二维数组中的元素时很有用。在我们的例子中,第一个返回列表的第一个元素很有趣。
【讨论】:
【参考方案3】:这是一个使用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]])
【讨论】:
pop 返回值,列表变短【参考方案4】:与 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]
【讨论】:
【参考方案5】: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
方法,但您可以只使用基本切片(这会很有效,因为它返回的是视图,而不是副本):
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
可以将索引作为参数。这不行。
你能解释一下这个 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]以上是关于list.pop 的 numpy 等效项?的主要内容,如果未能解决你的问题,请参考以下文章