NumPy-List的等价物?

ev7lccsx  于 2022-11-10  发布在  其他
关注(0)|答案(9)|浏览(129)

有没有一种NumPy方法可以等同于内置的pop用于python列表?
弹出显然不适用于Numpy数组,我希望避免列表转换。

u3r8eeie

u3r8eeie1#

没有用于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

pbpqsu0x

pbpqsu0x2#

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

vaj7vani3#

NumPy数组不存在POP,但您可以将NumPy索引与数组重构结合使用,例如hSTACK/vSTACK或numpy.ete(),以模拟POP。
下面是我能想到的一些示例函数(当索引为-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])
6vl6ewon

6vl6ewon4#

与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]
lyr7nygr

lyr7nygr5#

重要的是,它从原始数组中取出一个并将其删除。如果您没有找到单个方法的表面实现来完成该过程,下面的代码将完成您想要的操作。

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]
b4wnujal

b4wnujal6#

在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()方法返回两个列表。第一个函数返回匹配元素的行索引,第二个函数返回列索引。这在搜索二维数组中的元素时很有用。在我们的例子中,第一个返回列表的第一个元素很有趣。

1wnzp6jl

1wnzp6jl7#

unutbu对此有一个simple answer,但是POP()也可以将索引作为参数。这就是用NumPy复制它的方式:

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

3zwtqj6y8#

此外,如果您想为NumPy 2D数组中的行或列实现POP,您可以这样做:

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

对于ROW:

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

yebdmbv49#

好的,由于我没有看到返回第一个元素并将其从原始数组中删除的好答案,我编写了一个简单的(如果笨拙的)函数,将global用于一维数组(对于Multidims需要进行修改):

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

相关问题