【问题标题】:Remove sequential NumPy array index in a loop over it's content在其内容的循环中删除顺序 NumPy 数组索引
【发布时间】:2014-12-22 14:06:37
【问题描述】:

我正在遍历 OpenCV 行的 NumPy (nd) 数组。我想删除所有垂直 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 数组索引?

谢谢!

【问题讨论】:

  • 如果您希望有人帮助您,则需要更好地解释问题...
  • 您还需要什么其他信息?
  • 这段代码行 if (line[1]*180)/np.pi > 8 究竟做了什么,或者你想用它实现什么?
  • 它检查直线是否大于 8 度,如果是,则从 NumPy 数组中删除该项目。问题主要是关于从 NumPy 数组中删除或创建一个没有这些的新数组

标签: python arrays opencv numpy scipy


【解决方案1】:

在遍历该数组时不能删除数组索引。它会给出错误的结果。假设您处于迭代 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)

【讨论】:

  • 您的解决方案出现错误。 ValueError: 无效条目
【解决方案2】:

我猜你的代码中缺少缩进,所以我这样解释:

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 将布尔数组转换为数组,其中列出了所有具有真值的索引。

例如:

>>> a  = np.arange(10)
>>> a[~a%2==0]
array([1, 3, 5, 7, 9])

【讨论】:

  • 你的倒数第二行是做什么的?不熟悉语法
  • @MarkCorrigan 我现在添加了更多解释、示例和文档链接。这就是现在如何以“Numpythonic”方式解决问题的方法。
  • 最后一个delete 可以替换为布尔索引:a[~a%2==0]delete 是一个复杂的函数,它总是返回一个新数组。它不直接修改其输入。
猜你喜欢
  • 1970-01-01
  • 2015-03-15
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-08
  • 2021-12-20
  • 1970-01-01
相关资源
最近更新 更多