从ndarray的ndarray中删除元素

时间:2017-10-07 01:26:00

标签: python numpy

我有一个466 x 700 numpy.ndarry。对于466 x 700 ndarray中的每个ndarray,我想按索引删除元素。这是到目前为止:

normalized_img = numpy.atleast_3d(img).astype(numpy.float) / 255.
for x, y in seam:
  numpy.delete(normalized_img[y], x)

seam由坐标元组(x, y)组成 img是一个466 x 700 ndarray dtype=uint8

我想从(x, y)删除normalized_img。我该怎么办?使用pdb.set_trace(),即使在我遍历所有seam之后,我仍然可以看到它仍然是466 x 700。 seam的长度为466.我在迭代所有seam后期待466 x 699。

seam的示例:(13,0), (12,1), (11,2), (10,3), ...

我也尝试过:

normalized_img = numpy.atleast_3d(img).astype(numpy.float) / 255.
for x, y in seam:
  normalized_img[y] = numpy.delete(normalized_img[y], x)

但是我收到了这个错误:

Traceback (most recent call last):
  File "seam_carver.py", line 118, in <module>
    sys.exit(main(sys.argv))
  File "seam_carver.py", line 114, in main
    sc = SeamCarver(image, int(width), int(height))
  File "seam_carver.py", line 29, in __init__
    self.seam_carve()
  File "seam_carver.py", line 79, in seam_carve
    normalized_img[y] = numpy.delete(normalized_img[y], x)
ValueError: could not broadcast input array from shape (2099) into shape (700,3)

我认为这是由于形状不匹配,但我不确定如何解决这个问题。

1 个答案:

答案 0 :(得分:2)

我无法轻易地重现您的问题,但是documentation表示numpy.delete会返回:

  

删除了obj指定的元素的arr副本。注意   删除不会就地发生。如果axis为None,则out为flating   阵列。

表示您的更改不适用于数组本身,而是适用于其副本,并且需要执行其他步骤才能修改normalized_img

这假设您要将每一行修剪一列(如果最终的数组大小应该减少一列,那么这是您所期望的那样?)

tr_sz =(normalized_img.shape[0],normalized_img.shape[1]-1) 
temp = np.zeros(tr_sz)
for x, y in seam:
    temp[y] = np.delete(normalized_img[y], x)

normalized_img = temp