首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从数组中删除小元素

问从数组中删除小元素
EN

Stack Overflow用户
提问于 2019-08-07 17:04:07
回答 3查看 148关注 0票数 1

我只是想知道为什么这个从数组中截取小数字的小函数不起作用。

代码语言:javascript
复制
def chopper(values):
    for i in range(len(values)):
        if np.abs(values[i])<10**(-9):
            values=np.delete(values,i)
    return values

print(chopper(np.array([1,2,10**(-10),-10**(-10),3])))

我希望得到1,2,3。但我得到了一个错误消息: IndexError:索引4超出了大小为4的轴0的边界

我做错什么了?

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-08-07 17:10:07

您在迭代数组时使用np.delete从数组中删除了元素(我还在不断增加)。

因此,您应该在每次删除以下值时减小i的值:

代码语言:javascript
复制
import numpy as np

def chopper(values):
    i = 0
    continue_ = i < len(values)
    while continue_:
        if np.abs(values[i]) < 10**(-9):
            values=np.delete(values,i)
        else:
            i += 1
        continue_ = i < len(values)
    return values

print(chopper(np.array([1,2,10**(-10),-10**(-10),3])))

或者拥抱numpy口罩的力量,这要高效得多:

代码语言:javascript
复制
import numpy as np

def chopper(values):
    mask = np.abs(values) > 10**(-9)
    return values[mask]

print(chopper(np.array([1,2,10**(-10),-10**(-10),3])))

当然,这可以在一行程序中完成:

代码语言:javascript
复制
values = values[np.abs(values) > 10**(-9)]
票数 1
EN

Stack Overflow用户

发布于 2019-08-07 17:10:17

这是因为您每次删除元素时都会减小数组/列表的大小。

如果是numpy数组,则可以使用索引:

代码语言:javascript
复制
values = values[np.abs(values) < 1e-9]
票数 2
EN

Stack Overflow用户

发布于 2019-08-07 17:09:50

在迭代values数组时,您将从该数组中删除一个值。如果您从数组中删除一个条目,len(values)将把您送出此数组的边界。

幸运的是,如果只想过滤数组,可以通过python中的列表理解来实现。

代码语言:javascript
复制
def chopper(values):
    return [v for v in values if np.abs(v) >= 10**(-9)]

这将创建一个仅包含选定元素的新数组

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57390707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档