【问题标题】:numpy-equivalent of list.pop?list.pop 的 numpy 等效项?
【发布时间】:2017-02-18 02:46:39
【问题描述】:

是否有一个 numpy 方法等效于 python 列表的内置 pop

Popping 显然不适用于 numpy 数组,我想避免列表转换。

【问题讨论】:

  • pop 在 numpy 中不存在,根据设计,不建议模拟它。您最好在不使用流行模式的情况下接近您需要编写的算法

标签: python arrays list numpy stack


【解决方案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]
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-09-05
          • 2012-01-12
          • 2021-08-12
          • 2016-09-18
          • 1970-01-01
          • 2016-06-04
          • 1970-01-01
          相关资源
          最近更新 更多