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 等效项?的主要内容,如果未能解决你的问题,请参考以下文章

利用nump生成正态分布样本

nump库的简单函数介绍

使用新型信号/插槽时的 PyQt_PyObject 等效项?

nump中的为随机数产生器的seed

Numpy数组维度

从火炬张量方法中解压和扩展的numpy等效代码