使用 numpy.frompyfunc 将广播添加到带参数的 python 函数

2023-12-02

从像这样的数组db(这将大约是(1e6, 300)) and a mask = [1, 0, 1]向量,我将目标定义为第一列中的 1。

我想创建一个out由其中相应行组成的向量db匹配mask and target==1,其他地方都是零。

db = np.array([       # out for mask = [1, 0, 1]
# target,  vector     #
  [1,      1, 0, 1],  # 1
  [0,      1, 1, 1],  # 0 (fit to mask but target == 0)
  [0,      0, 1, 0],  # 0
  [1,      1, 0, 1],  # 1
  [0,      1, 1, 0],  # 0
  [1,      0, 0, 0],  # 0
  ])

我定义了一个vline函数应用了mask对每个数组行使用np.array_equal(mask, mask & vector)检查向量 101 和 111 是否适合掩码,然后仅保留索引,其中target == 1.

out被初始化为array([0, 0, 0, 0, 0, 0])

out = [0, 0, 0, 0, 0, 0]

The vline函数定义为:

def vline(idx, mask):
    line = db[idx]
    target, vector = line[0], line[1:]
    if np.array_equal(mask, mask & vector):
        if target == 1:
            out[idx] = 1

我通过在一个程序中逐行应用这个函数得到了正确的结果for loop:

def check_mask(db, out, mask=[1, 0, 1]):
    # idx_db to iterate over db lines without enumerate
    for idx in np.arange(db.shape[0]):
        vline(idx, mask=mask)
    return out

assert check_mask(db, out, [1, 0, 1]) == [1, 0, 0, 1, 0, 0] # it works !

现在我想矢量化vline通过创建一个ufunc:

ufunc_vline = np.frompyfunc(vline, 2, 1)
out = [0, 0, 0, 0, 0, 0]
ufunc_vline(db, [1, 0, 1])
print out

But the ufunc抱怨使用这些形状广播输入:

In [217]:     ufunc_vline(db, [1, 0, 1])
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-217-9008ebeb6aa1> in <module>()
----> 1 ufunc_vline(db, [1, 0, 1])
ValueError: operands could not be broadcast together with shapes (6,4) (3,)
In [218]:

转换vline to a numpy ufunc从根本上讲没有意义,因为 ufunc 总是以元素方式应用于 numpy 数组。因此,输入参数必须具有相同的形状,或者必须是可广播的到相同的形状。您正在将两个形状不兼容的数组传递给您的ufunc_vline功能 (db.shape == (6, 4) and mask.shape == (3,)),因此ValueError你正在看到。

还有一些其他问题ufunc_vline:

  • np.frompyfunc(vline, 2, 1)指定vline应该返回单个输出参数,而vline实际上什么也不返回(但修改out到位)。

  • 你正在路过db作为第一个参数ufunc_vline, 然而vline期望第一个参数是idx,它用作行的索引db.

另外,请记住,使用 Python 函数创建 ufuncnp.frompyfunc与标准 Python 相比不会产生任何明显的性能优势for环形。要看到任何重大改进,您可能需要使用低级语言(例如 C)对 ufunc 进行编码(请参阅这个例子在文档中)。


话虽如此,你的vline可以使用标准布尔数组运算轻松对函数进行向量化:

def vline_vectorized(db, mask): 
    return db[:, 0] & np.all((mask & db[:, 1:]) == mask, axis=1)

例如:

db = np.array([       # out for mask = [1, 0, 1]
# target,  vector     #
  [1,      1, 0, 1],  # 1
  [0,      1, 1, 1],  # 0 (fit to mask but target == 0)
  [0,      0, 1, 0],  # 0
  [1,      1, 0, 1],  # 1
  [0,      1, 1, 0],  # 0
  [1,      0, 0, 0],  # 0
  ])

mask = np.array([1, 0, 1])

print(repr(vline_vectorized(db, mask)))
# array([1, 0, 0, 1, 0, 0])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 numpy.frompyfunc 将广播添加到带参数的 python 函数 的相关文章

随机推荐

  • 如何通过在opencv python中单击鼠标按钮在正在播放的视频顶部绘制形状

    好吧 首先 我应该承认这是一个相当长的问题 我未能通过谷歌搜索找到可能的解决方案 我有一段视频 其中入侵者试图闯入栅栏的另一边 我可以追踪入侵者 但是当他在另一边时 我应该能够将入侵持续时间保存到文件中 入侵区域会是这样的 我认为这些步骤
  • 使用 getchar() 终止 while 循环

    对于我的家庭作业 我需要实现霍纳斯算法来在碱基之间进行转换 我被告知要使用getchar 对于这个任务 但我遇到一个问题 当我按 Enter 时 程序不会终止 只是接受更多字符 例子 bryce gt pa1 Enter the fromR
  • 知道 filename:line_no 导入 my_module 的位置

    我有一个模块my module它是由许多文件使用以下方式获取 导入 的 from my module import 在模块内部 我可以知道哪个文件导入了该模块吗 我想知道进行此导入的文件名 line no 所以我需要的代码是 my modu
  • 如何向 eclipse C 项目添加库?

    I need to add a C library to C project in Eclipse indigo What I ve done so far I ve downloaded and installed the library
  • MVC3 中的 URL 重写

    我正在为当地一所大学使用 MVC3 开发一个项目 我遇到了一个要求 我被困住了 找不到任何出路 假设我的 URL 是 www abc com要求是 如果我们在 URL 后输入教师姓名 我们将获得该教师的详细视图 例如 www abc com
  • Tomcat Servlet 类NotFoundException

    我创建了简单的 servlet package servlets import javax servlet ServletException import javax servlet http HttpServlet import java
  • 在 Java Swing 应用程序中创建在线帮助 - 使用 pdf 用户文档

    我正在尝试将一些用户文档链接到我的 Java Swing 应用程序 用户文档是 pdf 格式 我希望能够单击应用程序中的按钮 打开某种 pdf 渲染器来显示我的 userdoc pdf 我不想使用运行时执行命令 我尝试了以下方法 但没有取得
  • 如何在 JSP 中将值插入到 derby 数据库中?

    我在 JSP 中创建了一个表单来将数据插入到 derby 中的数据库中 但它不起作用 数据库名称是 CUSTOMER 表格 ID int CNAME varchar ADDRESS varchar PHONENUMBER varchar c
  • 无法监视 HttpSession / Mockito

    我想要部分嘲笑Httpsession但为此我需要监视它而不是嘲笑它 并且如果没有已经被嘲笑的请求对象 我就无法获得它的接口 请帮忙 换句话说 我怎样才能得到一个对象HttpSession没有HttpServletRequest object
  • 将 Google 图表另存为 pdf

    我正在尝试将饼图另存为 pdf 文件 如下所示http keepcoding ehsanabbasi com php convert google chart to png and pdf 在 php chartsrc 中包含 javasc
  • 无法在 SD 卡上写入文件

    我试图在 SD 卡上写入照片 但没有成功 我已经获得了在可移动存储中写入的权限 并且 SD 卡已安装 另外 我检查了 SD 卡的路径是否存在 并且得到了肯定的结果 失败的地方是当我使用mkdir 功能 它返回 false 并且没有创建文件
  • java中的selenium异常(org.openqa.selenium.remote.UnreachableBrowserException)

    我知道有很多线程正在运行 但没有一个线程可以解决这个问题 我正在尝试使用 selenum 获取 aspx 页面 但它在这行代码处抛出 UnreachableBrowserExceptionWebDriver driver new Chrom
  • 如何为uuid设置cookie

    我有一个网站 每次加载 刷新页面时都会生成一个 uuid 我想使用 cookie 使某个值在一段时间内保持不变 有谁知道可以帮助我的脚本吗 不确定您为什么要求脚本 或者这里的问题是什么 要设置 cookie 只需使用 if empty CO
  • Angular 2如何加载具有子依赖项的第3方供应商节点模块

    正在加载单节点模块在 Angular 2 中角度 cliwiki 中对引导项目进行了很好的描述 只是好奇 如何在使用 angular cli 引导的项目中很好地加载更复杂的节点模块 例如 angular2 apollo 依赖于几个子依赖项
  • 如何使用 AVFoundation 设置逐帧生成的视频的方向?

    我正在编写一个 iPhone 应用程序 它从相机获取视频 通过一些 OpenGL 着色器代码运行它 然后使用以下命令将输出写入视频文件AVFoundation 该应用程序以横向运行 或者 因此所有录制的视频都应该是横向的 我在开始录制之前使
  • 在 Redhat 上从 C++ 解压文件:system() 的替代方法

    我需要在运行 C 程序时解压缩文件 如中所述在 RedHat 机器上执行 C 代码之前等待解压完成 为此 我目前正在执行以下操作 system unzip usr bin File ZippedFile gz d usr bin File
  • 仅对数字列求和并将值除以总计

    我在对数据框进行一些计算时遇到问题 这是我的 DF 还有更多行和列 我想做的是 步骤 1 对于每个月 我想对资产列进行求和 例如 所有 asset Jan 2018 并输出为 DF 步骤 2 然后 对于每个公司 我想将每月的资产除以该月的总
  • C#:为什么要签署程序集?

    在我接管的一些 C 代码中 在 Visual Studio 2005 中 我注意到程序集都使用相同的签名 snk file 为什么前一作者会以这种方式签署程序集 签署程序集是否必要以及什么 不签字会不会有错 有什么缺点 签署程序集 是否会导
  • JavaScript 中如何四舍五入到小数点后一位?

    你能将 JavaScript 中的数字四舍五入到小数点后一个字符 正确四舍五入 吗 我尝试了 10 round 10 但它在 int 末尾留下了两位小数 Math round num 10 10有效 这是一个例子 var number 12
  • 使用 numpy.frompyfunc 将广播添加到带参数的 python 函数

    从像这样的数组db 这将大约是 1e6 300 and a mask 1 0 1 向量 我将目标定义为第一列中的 1 我想创建一个out由其中相应行组成的向量db匹配mask and target 1 其他地方都是零 db np array