如何解决如何以pythonic方式从数组中删除十进制值
我正在尝试从数组中删除一个元素。当尝试删除整数值(使用 numpy.delete)时,它可以工作,但不适用于十进制值。
For integer deletion
X = [1. 2. 2.5 5.7 3. 6. ]
to_delete_key = [3,7.3]
Y = np.delete(X,to_delete_key,None)
Output is [1. 2. 2.5 5.7 6. ]
The value 3 got deleted
而在十进制删除的情况下
For decimal deletion
X = [6. 7.3 9.1]
to_delete_key = [3,None)
Output is [6. 7.3 9.1]
The value 7.3 didn't get deleted.
我知道如何以正常方式进行操作,但是否有任何有效的 Pythonic 方法可以做到这一点
解决方法
In [249]: X = np.array([1.,2.,2.5,5.7,3.,6. ])
...: to_delete_key = [3,7.3]
In [252]: np.delete(X,to_delete_key)
Traceback (most recent call last):
File "<ipython-input-252-f9031065a548>",line 1,in <module>
np.delete(X,to_delete_key)
File "<__array_function__ internals>",line 5,in delete
File "/usr/local/lib/python3.8/dist-packages/numpy/lib/function_base.py",line 4406,in delete
keep[obj,] = False
IndexError: arrays used as indices must be of integer (or boolean) type
使用整数:
In [253]: np.delete(X,3)
Out[253]: array([1.,6. ])
删除的是 5.7,X[3]
。
np.delete
不按值删除!来自文档:
obj : slice,int or array of ints
Indicate indices of sub-arrays to remove along the specified axis.
我们可以寻找值匹配
In [267]: vals = [3,2.5]
In [268]: X[:,None]==vals
Out[268]:
array([[False,False],[False,True],[ True,False]])
但是浮点数上的相等匹配可能不可靠。 isclose
以容差运行:
In [269]: np.isclose(X[:,None],vals)
Out[269]:
array([[False,False]])
然后找到匹配的行:
In [270]: _.any(axis=1)
Out[270]: array([False,False,True,False])
In [271]: X[_]
Out[271]: array([2.5,3. ])
In [272]: X[~__]
Out[272]: array([1.,6. ])
列表具有按值删除:
In [284]: alist=X.tolist()
In [285]: alist.remove(3.0)
In [286]: alist.remove(2.5)
In [287]: alist
Out[287]: [1.0,2.0,6.0]
,
您正在处理无法精确比较的浮点数。谷歌搜索“每个程序员都应该知道的关于浮点数的知识”。
由于舍入误差,1/3 + 1/3 + 1/3 可能不等于 1。
所以解释是没有找到你的值7.3。 Numpy 可能将 7.3 转换为 32 位浮点数或任何不完全等于数组中的内容。
正如@elPastor 所提到的,您正在滥用 Numpy。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。