如何从np.linspace生成的列表中移除零元素?
问题分析与解决方案
为什么你的两种方法失效?
np.linspace(-20,20)默认生成50个等间距浮点数,这里面没有精确等于0的数,但有两个数非常接近0:-20/49≈-0.408和20/49≈0.408。
- 第一种方法:把浮点数转
int时,这两个接近0的数会被截断成0,列表里会出现两个0。但x.remove(0)只会删除第一个出现的0,第二个0还留在列表里,所以看起来没完全清理掉。 - 第二种方法:判断条件是原浮点数
x!=0,这两个接近0的数确实不等于0,所以会被保留,转int后还是0,结果里依然有0。
正确解决方案
根据你的需求,推荐以下几种方法:
1. 直接生成不含0的整数序列(最简便)
如果目标是获取-20到20的整数(不含0),不用linspace,用numpy的arange更直接:
import numpy as np # 合并负整数和正整数序列,转成列表 result = np.concatenate([np.arange(-20, 0), np.arange(1, 21)]).tolist()
2. 基于linspace序列过滤转int后为0的元素
如果你必须用linspace生成的序列,可通过以下方式过滤:
import numpy as np # 方法A:先转int再过滤0 x = list(map(int, np.linspace(-20, 20))) result = [num for num in x if num != 0] # 方法B:先判断原数绝对值是否≥1(避免转int后变0),再转int result = [int(num) for num in np.linspace(-20, 20) if abs(num) >= 1] # 方法C:numpy原生操作(效率更高) x = np.linspace(-20, 20) result = x[abs(x) >= 1].astype(int).tolist()
3. 让linspace包含精确的0再过滤
如果想让linspace生成的序列里有精确的0,需要指定奇数个采样点(比如41个,步长为1),之后再过滤:
import numpy as np # 生成包含-20到20所有整数的序列(共41个点) x = np.linspace(-20, 20, 41) # 直接过滤掉精确的0 result = x[x != 0].tolist()
内容的提问来源于stack exchange,提问作者Borimir Georgiev
相关产品推荐
相关产品推荐

