python - 从两个具有接近值的二维数组中查找行索引
问题描述
我有一个数组a
a = np.array([[4, 4],
[5, 4],
[6, 4],
[4, 5],
[5, 5],
[6, 5],
[4, 6],
[5, 6],
[6, 6]])
和一个数组b
b = np.array([[4.001,4],
[8.001,4],
[5,4.0003],
[5.9999,5]])
我想找到它的索引a
值非常接近b
. 如果b
数组的值与 I 中的值完全相同,则a
可以使用以下代码。
np.where((a==b[:,None]).all(-1))[1]
为了清楚起见;我希望代码返回以下内容:[0,1,5]
这些是 a 的索引,非常接近 b 中的行。带有值的 inb
值[8.001,4]
被丢弃,因为它不在a
. 我认为将上面的代码与 np.allclose() 结合可以解决它,但是我似乎无法弄清楚如何做到这一点,你能帮我吗?
解决方案
而不是==
,使用np.linalg.norm
on来获取 in 中的每一行到每一行a - b[:, np.newaxis]
的距离。a
b
如果a
并且b
有很多行,这将使用大量内存:例如,如果每个行有 10,000 行,则vecdiff
下面的数组将是 10,000×10,000 或 100,000,000 个元素;使用双打这是 800MB。
In [50]: a = np.array([[4, 4],
...: [5, 4],
...: [6, 4],
...: [4, 5],
...: [5, 5],
...: [6, 5],
...: [4, 6],
...: [5, 6],
...: [6, 6]])
...:
In [51]: b = np.array([[4.001,4],
...: [8.001,4],
...: [5,4.0003],
...: [5.9999,5]])
In [52]: vecdist = np.linalg.norm(a - b[:, np.newaxis], axis=-1)
In [53]: closeidx = np.flatnonzero(vecdist.min(axis=0) < 1e-2)
In [54]: print(closeidx)
[0 1 5]
推荐阅读
- c++ - 无法访问数学常数
- html - 输入类型=“文本区域”。在行尾换行
- c# - SignalR - 如果 roomName 包含 '(撇号),则未收到消息
- reactjs - 如何通过 github 页面上传和链接带有域名的 React 网站?
- javascript - Admin-on-rest - 将分页放在顶部
- css - 如何根据字符串长度有条件地在 Sass 上设置字体大小
- c++ - 在c中使用winsock2头文件和lib时在控制台中出错
- java - 如何从链表中反转堆栈?
- javascript - JavaScript 队列植入
- c# - 阅读 iText7 XObject QrCode c#