【问题标题】:dsearchn equivalent in pythonpython中的dsearchn等价物
【发布时间】:2021-06-04 05:20:22
【问题描述】:

是否有 Scipy 或 Numpy 函数可以在 python 中完成dsearchn MATLAB 命令的工作?

dsearchn 返回给定向量中最接近输入值的索引。

【问题讨论】:

    标签: python python-3.x matlab numpy scipy


    【解决方案1】:

    效率大致相当的方法可能是 scipy 的 KDTree 或更好的 cKDTree

    from scipy.spatial import KDTree
    
    kdt = KDTree(P.T)
    kdt.query(PQ.T)
    

    这里的PPQdsearch 文档中的点和查询点。 MATLAB 使用第一个维度作为点的维度,而 scipy 使用最后一个维度,因此是转置。

    与一步完成的 MATLAB 方法不同,使用 KDTree 我们分两步完成:首先构建树对象,然后在其上运行 query

    【讨论】:

    • 它的语法是不是像MATLAB的dsearchn?因为它没有给出欧几里得空间中距离最小的值索引。我也查看了文档,但我不明白它是如何工作的,以及为什么你转置了 PQ? PQ 可以是标量,不需要转置。
    • @Enigmacy。根据文档,scipy 和 Matlab 版本相对于彼此向后解释尺寸。如果您的数组已经采用正确的格式,则无需转置。 query 的返回值包含一个值和一个索引。您阅读了哪些文档?
    • 我从 Scipy v1.6.1 检查了这个doc
    • 这是一个好的开始。也看一下查询方法。我在答案中添加了链接和简介:docs.scipy.org/doc/scipy/reference/generated/…
    【解决方案2】:

    你可以这样做:

    x = np.array([1.1, 1.2, 1.22, 1.4])
    v  = 1.21
    
    def dsearchnn(x, v):
        return np.where(np.abs(x-v) == np.abs(x-v).min())[0]
    dsearchnn(x, v)
    array([1,2])
    

    【讨论】:

    • 有没有办法检测两个具有相同距离的索引?例如在 x = [1.1, 1.2, 1.22, 1.3, 1.4] 中,值 1.2 和 1.22 与 v 的距离相同。
    • 是的,刚刚编辑了答案。浮点精度可能存在问题。 @Enigmacy
    • dsearchn 用于多维点,而不仅仅是标量
    【解决方案3】:

    因为 x 和 v 都是向量:

    def dsearchn(x, v):
        z=np.atleast_2d(x)-np.atleast_2d(v).T
        return np.where(np.abs(z).T==np.abs(z).min(axis=1))[0]
    

    【讨论】:

      猜你喜欢
      • 2018-09-06
      • 2013-02-06
      • 2012-03-22
      • 2016-12-27
      • 2013-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多