微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何以pythonic方式从数组中删除十进制值

如何解决如何以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 举报,一经查实,本站将立刻删除。