繁体   English   中英

删除MXN numpy数组中特定位置的元素

[英]Deleting elements at specific positions in a M X N numpy array

我正在尝试实现Seam雕刻算法,其中我们必须从图像中删除接缝。 图像存储为numpy MXN阵列。 我找到了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的新手, 我找到了关于单维数组或删除整行或列的 解决方案 但我找不到从特定列中删除元素的方法。

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

一种选择是确定要删除哪些,从展平的阵列中删除它们,然后将其重新整形为正确的形状。 然后,您有责任确保删除正确数量的元素。

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

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

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

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的阵列。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM