我正在迭代NumPy(nd)OpenCV行数组。我想删除所有8度垂直的线。我意识到numpy数组是不可变的,我在代码中做的不对,但它表明了我正在尝试做的事情;
index = 0
for line in self.lines[0]:
if (line[1]*180)/np.pi > 8:
self.lines[0] = np.delete(self.lines[0], index, axis=0)
index+=1
如何去除这些NumPy数组索引?
谢谢!
答案 0 :(得分:3)
迭代该数组时无法删除数组索引。它会给出错误的结果。假设您在迭代5并且此索引满足if
条件并且需要被删除,但是如果我们删除它将导致索引6处的数组元素到达索引5并且选择的下一个元素将是7来到删除后的索引6因此从不检查条件最初在索引6处的条件,即在删除之前。
处理这个问题的基本思想是将这些索引附加到列表中并在lope之外删除它们。所以你的代码是:
index = 0
idx = []
for line in self.lines[0]:
if (line[1]*180)/np.pi > 8:
idx.append(index)
index+=1
self.lines[0] = np.delete(self.lines[0], idx, axis=0)
答案 1 :(得分:1)
我猜您在代码中缺少缩进,因此我将其解释为:
index = 0
for line in self.lines[0]:
if (line[1]*180)/np.pi > 8:
self.lines[0] = np.delete(self.lines[0], index, axis=0)
index+=1
你可以在没有循环的情况下做到这一点。首先,我们进行检查以构建boolean indexing array(数组中每个项目的True / False值):
index = self.lines[0,:,1]*180/np.pi > 8
然后我们选择条件为假的行:
a[~a%2==0]
其中np.nonzero
从布尔数组转换为数组,其中列出了具有True值的所有索引。
例如:
>>> a = np.arange(10)
>>> a[~a%2==0]
array([1, 3, 5, 7, 9])