如何解决比较两个数组时出错:DeprecationWarning:元素比较失败;这将在未来引发错误
我有一个形状为 a
的数组 (1000000,32)
和形状为 b
的数组 (10000,32)
我想找到包含 b 行的 a 的索引。 我写了以下代码:
I = np.argwhere((a == b[:,None]).all(axis=2))[:,1]
当我在其他情况下测试它时,它工作得很好。但是对于我当前的数组,它给出了以下错误:
...\Anaconda3\lib\site-packages\ipykernel_launcher.py:111: DeprecationWarning: elementwise comparison Failed; this will raise an error in the future.
AttributeError: 'bool' object has no attribute 'all'
知道错误的根源是什么吗?谢谢
解决方法
运行:
result = (a[:,np.newaxis] == b).all(-1).any(-1)
步骤:
-
a[:,np.newaxis] == b
- “按元素”比较。第一和第二索引 - a 和 b 行的索引,第三个索引 - 两行中的列索引。 -
….all(-1)
- a[i] 在 b[j] (all 两行的元素相等)。 -
….any(-1)
- a[i] 在 b 的任何行中是否有它的“对应物”。
要检查每个步骤的结果,请使用 2 个数组,例如最多 10 行和 2 列。
,np.arange(a.shape[0])[np.isin(a,b).all(axis=1)]
>>> import numpy as np
>>> a=np.arange(60).reshape(10,6)
>>> a
array([[ 0,1,2,3,4,5],[ 6,7,8,9,10,11],[12,13,14,15,16,17],[18,19,20,21,22,23],[24,25,26,27,28,29],[30,31,32,33,34,35],[36,37,38,39,40,41],[42,43,44,45,46,47],[48,49,50,51,52,53],[54,55,56,57,58,59]])
>>> b=np.arange(24).reshape(4,6)
>>> b
array([[ 0,23]])
>>> np.arange(a.shape[0])[np.isin(a,b).all(axis=1)]
array([0,3])
当然 np.isin()
在文档 here 中并测试 a
的元素是否在 b
中。提问者已经熟悉 all()
和 axis=1
参数的使用。因此,np.isin(a,b).all(axis=1)
生成一个布尔数组,该数组从 a
的索引中进行选择,该索引由 np.arange(a.shape[0])
表示。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。