我正在尝试实现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。但是我找不到从特定列中删除元素的方法。
答案 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]])
请注意,即使x
和mask
都是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]]