删除M X N numpy数组中特定位置的元素

时间:2015-10-25 23:51:40

标签: python arrays numpy

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

例如:2 X 3阵列

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

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

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

print img_array

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

完成的工作:

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

2 个答案:

答案 0 :(得分:2)

您是否总是从每行中删除一个元素?如果您尝试从一行中删除一个元素而不是另一行,则最终会得到一个不规则的数组。这就是为什么没有通用的方法从2d数组中删除单个元素。

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

所有这些'delete'方法实际上都将'keep'值复制到一个新数组。实际上没有删除原始数组中的元素。因此,您可以轻松(并且同样快)将您自己的副本复制到新阵列。

另一种选择是使用列表列表。那些人更容忍变得衣衫褴褛。

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

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,索引结果也会变平。这样的掩模很容易产生一个无法重新塑造成2d的阵列。

答案 1 :(得分:1)

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

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