在循环中删除顺序NumPy数组索引的内容

时间:2014-12-22 14:06:38

标签: python arrays opencv numpy scipy

我正在迭代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数组索引?

谢谢!

2 个答案:

答案 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])