[英]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]]
完成工作:
你会永远删除每一行中的一个元素吗? 如果您尝试从一行中删除一个元素而不是另一行,则最终会得到一个不规则的数组。 这就是为什么没有从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]])
请注意,即使x
和mask
都是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.