我只是想知道为什么这个从数组中截取小数字的小函数不起作用。
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的边界
我做错什么了?
谢谢
发布于 2019-08-07 17:10:07
您在迭代数组时使用np.delete从数组中删除了元素(我还在不断增加)。
因此,您应该在每次删除以下值时减小i的值:
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口罩的力量,这要高效得多:
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])))当然,这可以在一行程序中完成:
values = values[np.abs(values) > 10**(-9)]发布于 2019-08-07 17:10:17
这是因为您每次删除元素时都会减小数组/列表的大小。
如果是numpy数组,则可以使用索引:
values = values[np.abs(values) < 1e-9]发布于 2019-08-07 17:09:50
在迭代values数组时,您将从该数组中删除一个值。如果您从数组中删除一个条目,len(values)将把您送出此数组的边界。
幸运的是,如果只想过滤数组,可以通过python中的列表理解来实现。
def chopper(values):
return [v for v in values if np.abs(v) >= 10**(-9)]这将创建一个仅包含选定元素的新数组
https://stackoverflow.com/questions/57390707
复制相似问题