将重复参数传递给 Numpy 向量化函数的最佳方法

2023-12-11

所以,继续我和 @TheBlackCat 的讨论这个答案,我想知道将参数传递给 Numpy 向量化函数的最佳方法。所讨论的函数定义如下:

vect_dist_funct = np.vectorize(lambda p1, p2: vincenty(p1, p2).meters)

where, vincenty来自地质学包.

我目前打电话vect_dist_funct以这种方式:

def pointer(point, centroid, tree_idx):
    intersect = list(tree_idx.intersection(point))
    if len(intersect) > 0:
        points = pd.Series([point]*len(intersect)).values
        polygons = centroid.loc[intersect].values
        dist = vect_dist_funct(points, polygons)
        return pd.Series(dist, index=intercept, name='Dist').sort_values()
    else:
        return pd.Series(np.nan, index=[0], name='Dist')

points['geometry'].apply(lambda x: pointer(point=x.coords[0], centroid=line['centroid'], tree_idx=tree_idx))

(请参考这里的问题:带标签的数据类型 Python)

我的问题与函数内部发生的情况有关pointer。我转变的原因points to a pandas.Series然后获取值(在第四行,就在if声明)是使其形状与多边形相同。如果我只是将点称为points = [point]*len(intersect) or as points = itertools.repeat(point, len(intersect)),Numpy 抱怨它“不能一起广播大小为 (n,2) 和大小 (n,) 的数组”(n 是intersect).

如果我打电话vect_dist_funct像这样:dist = vect_dist_funct(itertools.repeat(points, len(intersect)), polygons), vincenty抱怨我给它传递了太多的参数。我完全不明白两者之间的区别。

请注意,这些是坐标,因此总是成对的。以下是如何操作的示例point and polygons看起来像:

point = (-104.950752   39.854744) # Passed directly to the function like this.
polygons = array([(-104.21750802451864, 37.84052458697633),
                  (-105.01017084789603, 39.82012158954065),
                  (-105.03965315742742, 40.669867471420886),
                  (-104.90353460825702, 39.837631505433706),
                  (-104.8650601872832, 39.870796282334744)], dtype=object)
           # As returned by statement centroid.loc[intersect].values

最好的通话方式是什么vect_dist_funct在这种情况下,这样我就可以进行矢量化调用,并且 Numpy 和 vincenty 都不会抱怨我传递了错误的参数?此外,还寻求能够最小化存储器消耗并提高速度的技术。目标是计算点到每个多边形质心之间的距离。


np.vectorize在这里并不能真正帮助你。根据文档:

提供矢量化函数主要是为了方便,而不是为了性能。该实现本质上是一个 for 循环。

实际上,vectorize主动伤害你,因为它将输入转换为 numpy 数组,进行不必要且昂贵的类型转换并产生你所看到的错误。使用具有以下功能的函数会更好for loop.

最好使用函数而不是lambda对于一个 to-level 函数,因为它可以让你拥有一个文档字符串。

这就是我将如何实现你正在做的事情:

def vect_dist_funct(p1, p2):
    """Apply `vincenty` to `p1` and each element of `p2`.

    Iterate over `p2`, returning `vincenty` with the first argument
    as `p1` and the second as the current element of `p2`.  Returns
    a numpy array where each row is the result of the `vincenty` function
    call for the corresponding element of `p2`.
    """
    return [vincenty(p1, p2i).meters for p2i in p2]

如果你真的想使用vectorize,您可以使用excluded不向量化的论点p1争论,或者更好的是建立一个lambda包裹着vincenty并且仅向量化第二个参数:

def vect_dist_funct(p1, p2):
    """Apply `vincenty` to `p1` and each element of `p2`.

    Iterate over `p2`, returning `vincenty` with the first argument
    as `p1` and the second as the current element of `p2`.  Returns
    a list where each value is the result of the `vincenty` function
    call for the corresponding element of `p2`.
    """
    vinc_p = lambda x: vincenty(p1, x)
    return np.vectorize(vinc_p)(p2)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将重复参数传递给 Numpy 向量化函数的最佳方法 的相关文章

随机推荐

  • 手机锁定时如何显示弹出活动或对话框?

    我试图在手机锁定时显示活动或对话框 我尝试过使用 WakeLock 但它不起作用 并且只有在手机解锁后我才能看到活动 执行此操作的正确方法是什么 要在不关闭键盘保护的情况下显示活动 请尝试以下操作 getWindow addFlags Wi
  • 设置 ProGuard 来混淆局部变量和参数

    我似乎找不到在被混淆的类的方法内部混淆局部变量的设置 这是我反编译的一个类的摘录 其中有一些明显缺失的部分 理想情况下 方法的参数和局部变量也将被混淆 public class eA extends gu private final gt
  • SKAction playSoundFileNamed 来自 Singleton

    我有几个级别都使用相同的音效 我没有在每个级别都使用相同的代码 而是将所有声音合并到一个单例类中 但是 当我从其他类运行该方法时 将其放在单例中不会播放声音 我没有任何错误或警告 当我在每个类中都有相同的代码时 我播放声音没有问题 问题 D
  • Mac 上的 Java 类路径是如何设置的?

    Mac 上的 Java 类路径是如何设置的 既然您用以下标签标记了问题tomcat 我假设您正在运行 Java Servlet Web 应用程序 在这种情况下 类路径覆盖了 JAR 文件 WEB INF libwebapp 的文件夹和所有类
  • Python:“NoneType”对象不可下标“错误[重复]

    这个问题在这里已经有答案了 我是 Python 数据库的新手 因此为了练习一些关键技能 我正在构建一个登录屏幕 将用户名和散列密码写入数据库 然后根据数据库中的内容检查用户的输入 但是 当尝试从数据库中提取用户名和密码并将其存储在变量中时
  • css 上的 Margin-Right 不起作用

    我在学校期间一直在搞编码 因为它是我在学校最感兴趣的事情 并且在学年的大部分时间里我一直在自学 Html Css 和 Js 我一直在重新创建学校的网站 但遇到了一些问题 我的 CSS Margin Right 命令不起作用 我一直在尝试集中
  • iOS:SDWebImageManager 不缓存图像

    我正在使用创建幻灯片UIImageView 并且图像链接位于数组中 所以当我这样做时 我了解到SDWebImageManager让我们只点击 URL 一次 然后它就会缓存图像以供以后使用 但我在应用程序中监视的是 我相信第一个图像已被缓存
  • 获取变量或参数的名称[重复]

    这个问题在这里已经有答案了 我想获取变量或参数的名称 例如 如果我有 var myInput input var nameOfVar GETNAME myInput gt nameOfVar should be myInput void t
  • Sqlldr 接受 1 种日期格式

    我有一个动态生成控制文件的sql脚本文件 它接受日期格式为 mm dd yyyy 的日期字段 sqlldr 正在从 csv 文件加载日期 但它也接受日期格式 例如 mm dd yyyy 或 mm dd yyyy 我如何让它只接受 MM DD
  • 为什么我的 Java try...catch 出现错误?

    我开始自学更多有关 Java 错误处理的知识 这是我的第一个程序 我尝试查看特定错误而不是使用catch Exception e 作为一个通用的包罗万象的catch 我正在删除一个文件并返回一条消息 表明该文件已成功删除或删除失败 如果删除
  • 大端和小端值是否可移植?

    你好 我在小端和大端有一个小问题 我知道这个问题已经问过n次了 但我无法弄清楚以下几点 让我们取 int i 10 它以二进制存储为00000000 00000000 00000000 00001010在堆栈部分如下 00000000 00
  • GBoard 键盘 GIF 贴纸集成

    我正在努力支持GBoard在我的应用程序中 我希望用户能够从 GBoard 中选择 GIF 我的onCommitContent看起来像这样 Override public void onCommitContent InputContentI
  • raphael.js - 将饼图转换为圆环图

    我正在尝试使用位于此处的 raphael js 示例 http raphaeljs com pie html 但我想将饼图转换为甜甜圈图 所有切片中间有一个洞 目前 每个切片都是使用以下代码创建的 function sector cx cy
  • knitr:块中的代码意外地被包装

    在使用 knit2pdf 和 LaTeX 的投影仪演示中 我有时 发现块中的代码被包装 即使我已经设置了tidy FALSE全球 例如 这个块 item Fit this using func glm lt
  • 保存到 CSV 时日期信息消失

    我试图从互联网上提取一些数据 然后将其导出到 CSV 文件 但我丢失了 CSV 文件中的日期信息 我不明白为什么 我是 R 新手 所以请保持简单的回答 这是我的代码 Library quantmod getSymbols SPY from
  • PHPUnit 测试双打

    我开始使用 PHPUnit 来测试我的代码 但我在理解双重测试方面遇到一些问题 我尝试存根类方法 b 以在从另一个方法调用时返回 true 而不是通常的行为 false 我有这样的代码 class MyClass function a re
  • 创建后数组大小发生变化

    谁能解释一下这里发生了什么 我的印象是 数组的大小一旦创建和声明就无法更改 public class ArrayManipulation public static void main String args int a 1 2 3 new
  • 解析 TO 标头中符合 RFC 822 的地址

    我想使用 preg match all 解析电子邮件地址列表 如 TO 标头中的列表 以获取用户名 如果存在 和电子邮件 与 Pear 中的 mailparse rfc822 parse addresses 或 Mail RFC822 pa
  • 返回 python 中最常出现的前 n 个字符及其各自的计数

    如何返回前 n 个最常出现的字符及其各自的计数 例如 aaaaaabbbbcccc 2应该返回 a 6 b 4 在Python中 我试过这个 def top chars input n list1 list input list3 list
  • 将重复参数传递给 Numpy 向量化函数的最佳方法

    所以 继续我和 TheBlackCat 的讨论这个答案 我想知道将参数传递给 Numpy 向量化函数的最佳方法 所讨论的函数定义如下 vect dist funct np vectorize lambda p1 p2 vincenty p1