【问题标题】:Deleting elements at specific positions in a M X N numpy array删除 M X N numpy 数组中特定位置的元素
【发布时间】:2016-01-25 00:06:04
【问题描述】:

我正在尝试实现接缝雕刻算法,其中我们必须从图像中删除接缝。图像存储为 numpy M X N 数组。我找到了接缝,它只是一个 M 整数数组,其值指定要删除的列值。

例如:一个 2 X 3 数组

import numpy 
img_array = numpy.array([[1, 2, 3],[4, 5, 6]])

seam = numpy.array([1,2]) 

这意味着我们必须从 Img 中删除第一行 (1) 中的第一个元素,以及第二行 (5) 中的第二个元素。删除后,Img 将是

print img_array

[[2,3]
 [4,6]]

工作完成:

我是 python 和I have found solutions 的新手,他们关心一维数组或deleting an entire row or column。但我找不到从特定列中删除元素的方法。

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    您是否总是从每一行中删除一个元素?如果您尝试从一行中删除一个元素,而不是另一个,您将得到一个参差不齐的数组。这就是为什么没有从二维数组中删除单个元素的通用方法。

    一种选择是找出您要删除的那些,将它们从展平的数组中删除,然后将其重新调整为正确的形状。那么您有责任确保删除正确数量的元素。

    所有这些“删除”方法实际上将“保留”值复制到一个新数组中。实际上没有什么会从原始数组中删除元素。因此,您可以同样轻松(并且同样快速)将自己的副本复制到新数组中。

    另一个选项是使用列表列表。那些更能容忍衣衫褴褛。

    这是一个使用布尔掩码从数组中删除选定元素的示例(当然是制作副本):

    In [100]: x=np.arange(1,7).reshape(2,3)
    In [101]: x
    Out[101]: 
    array([[1, 2, 3],
           [4, 5, 6]])
    In [102]: mask=np.ones_like(x,bool)
    In [103]: mask
    Out[103]: 
    array([[ True,  True,  True],
           [ True,  True,  True]], dtype=bool)
    In [104]: mask[0,0]=False
    In [105]: mask[1,1]=False
    In [106]: mask
    Out[106]: 
    array([[False,  True,  True],
           [ True, False,  True]], dtype=bool)
    In [107]: x[mask]
    Out[107]: array([2, 3, 4, 6])  # it's flat
    In [108]: x[mask].reshape(2,2)
    Out[108]: 
    array([[2, 3],
           [4, 6]])
    

    请注意,即使 xmask 都是 2d,索引结果也会变平。这样的掩码很容易产生一个无法重新整形回二维的数组。

    【讨论】:

    • 这似乎是最优雅的解决方案,无需花费内存。谢谢。
    【解决方案2】:

    矩阵中的每一行都是一维数组。

    import numpy
    ary=numpy.array([[1,2,3],[4,5,6]])
    print ary[0]
    

    array([1, 2, 3])
    

    您可以遍历您的矩阵,使用来自您seam 的值从当前行中删除一个元素。将结果附加到您正在构建的修改后的矩阵中。

    seam = numpy.array([1,2])
    for i in range(2):
      tmp = numpy.delete(ary[i],seam[i]-1)
      if i == 0:
        modified_ary = tmp
      else:
        modified_ary = numpy.vstack((modified_ary,tmp))
    
    print modified_ary
    

    给予

    [[2 3]
     [4 6]]
    

    【讨论】:

    • 我正在尝试你的逻辑。但是 numpy.append() 不会将行附加到修改后的数组。
    • 很抱歉。固定。
    • 感谢您的解决方案。由于效率原因,不得不选择 hpaulj 的答案。
    猜你喜欢
    • 2021-03-01
    • 1970-01-01
    • 2012-06-15
    • 2019-11-15
    • 2022-01-21
    • 2014-11-24
    • 1970-01-01
    • 2016-11-11
    相关资源
    最近更新 更多