包装 np.arrays __pow__ 方法

2024-07-04

我只是重新审视我的一些代码以提高性能,并遇到了一些奇怪的事情:

a = np.linspace(10,1000,1000000).reshape(1000,1000)

%timeit np.square(a)
100 loops, best of 3: 8.07 ms per loop

%timeit a*a
100 loops, best of 3: 8.18 ms per loop

%timeit a**2
100 loops, best of 3: 8.32 ms per loop

好吧,使用幂运算符时似乎有一些开销(**)但除此之外它们看起来是相同的(我猜 NumPy 就是这么做的),但随后就变得奇怪了:

In [46]: %timeit np.power(a, 2)
10 loops, best of 3: 121 ms per loop

所以没有问题,但为 magic pow 提供后备,而不为 UFUNC 提供后备,似乎有点不一致。但后来我开始感兴趣,因为我经常使用第三次幂:

%timeit a*a*a
100 loops, best of 3: 18.1 ms per loop

%timeit a**3
10 loops, best of 3: 121 ms per loop

%timeit np.power(a, 3)
10 loops, best of 3: 121 ms per loop

第三次幂似乎没有“捷径”,UFUNC 和“magic-pow”的工作原理相同(至少在性能方面)。

但这并不是那么好,因为我想要在代码中使用一致的方法,并且我不太确定如何包装__pow__的 numpy.

因此,为了切入主题,我的问题是:

有没有办法可以包装 numpys__pow__方法?因为我想要在我的脚本中以一致的方式写入权力而不是写入a**2在另一个地方power(a, 3)。简单地写a**3,并将其重定向到我的幂函数,将是首选(但为此我需要以某种方式包装 ndarrays__pow__或者?)。 目前我正在使用快捷方式,但这并不是那么漂亮(我什至必须声明 exponent==2 情况,因为np.power在那里表现不佳):

def power(array, exponent):
    if exponent == 2: #catch this, or it calls the slow np.power(array, exponent)
        return np.square(array)
    if exponent == 3:
        return array * array * array
    #As soon as np.cbrt is avaiable catch the exponent 4/3 here too
    return np.power(array, exponent) 

%timeit power(a, 3)
100 loops, best of 3: 17.8 ms per loop
%timeit a**3
10 loops, best of 3: 121 ms per loop

我正在使用 NumPy v1.9.3 并且我不想子类化np.ndarray只是为了包裹__pow__方法。 :-)

编辑:我重写了我提出问题的部分。澄清一下:我并不是在问为什么 NumPy 会这样做——这只是为了解释我为什么问这个问题。


这是一个很好的收获。我也想知道为什么会有这种行为。但为了简短而简洁地回答这个问题,我会这样做:

def mypower(array, exponent):
    return reduce(lambda x,y: x*y, [array for _ in range(exponent)])


%timeit mypower(a,2)
100 loops, best of 3: 3.68 ms per loop

%timeit mypower(a,3)
100 loops, best of 3: 8.09 ms per loop

%timeit mypower(a,4)
100 loops, best of 3: 12.6 ms per loop

显然,开销随着指数的增加而增加,但对于较低的指数来说,优于 10 倍时间。

Note这与原始的 numpy 实现不同,原始的 numpy 实现不是特定于数字指数的,并且支持指数数组作为第二个参数(在这里查看 http://docs.scipy.org/doc/numpy/reference/generated/numpy.power.html#numpy.power).

运算符超载

做你想做的事情的方法是继承 ndarray 并使用视图。请参见以下示例:

import numexpr
import numpy as np
​
class MyArray(np.ndarray):
    def __pow__(self, other):
        return reduce(lambda x,y: x*y, [self for _ in range(other)])
​
class NumExprArray(np.ndarray):
    def __pow__(self, other):
        return numexpr.evaluate("self**%f" % other)
        #This implies extra overhead, is as much as 4x slower:
        #return numexpr.evaluate("self**other")

a = np.linspace(10,1000,1000000).reshape(1000,1000).view(MyArray)
na = np.linspace(10,1000,1000000).reshape(1000,1000).view(NumExprArray)
​
%timeit a**2
1000 loops, best of 3: 1.2 ms per loop

%timeit na**2
1000 loops, best of 3: 1.14 ms per loop

%timeit a**3
100 loops, best of 3: 4.69 ms per loop

%timeit na**3
100 loops, best of 3: 2.36 ms per loop

%timeit a**4
100 loops, best of 3: 6.59 ms per loop

%timeit na**4
100 loops, best of 3: 2.4 ms per loop

有关此方法的更多信息,请关注此link http://docs.scipy.org/doc/numpy/user/basics.subclassing.html。另一种方法是使用自定义中缀运算符 https://pypi.python.org/pypi/infix/但出于可读性目的,不太好。正如人们所看到的,numexpr 应该是一种可行的方法。

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

包装 np.arrays __pow__ 方法 的相关文章

随机推荐

  • Gulp Uglify 选项不适用

    您好 我正在为我工 作的公司制作一个主题 JS 部分无法在 uglify 中正确构建 我正在尝试使用 uglify 来简单地连接我的文件 这可以工作 但它们输出缩小和损坏 没有注释 我不明白为什么 下面是我的 gulp 任务 它运行正确 但
  • 如何在 ADF Oracle 11gR1 中的对话框窗口中的弹出窗口中刷新表

    我正在研究显示一个带有搜索表的弹出窗口的要求 当用户单击弹出窗口中的搜索按钮 提供输入文本框 时 需要使用新的数据集刷新搜索表 我创建了一个populateSearchTable 通过填充数组中的值来生成表的方法deviceListArra
  • MVC3 – ViewModel 和控制器功能:建议的设计模式

    我为一个不太可用的呼叫中心应用程序构建了一个简单的基于 MVC3 的票务输入站点 并尝试重构我的原型以更好地遵循设计模式 部分原因是为了使其更易于维护 但主要是作为一种学习练习 面向用户的视图是一种由基本用户信息以及允许选择各种资源类型的面
  • 将分层(树状)XML 读入 pandas 数据帧,保留层次结构

    我有一个 XML 文档 其中包含分层的树状结构 请参阅下面的示例 该文档包含几个
  • 尝试访问 USB 设备时出现 RPC_E_CANTCALLOUT_ININPUTSYNCCALL

    我有这段代码 var searcher new ManagementObjectSearcher root CIMV2 SELECT FROM Win32 DiskDrive foreach var queryObj in searcher
  • 如何防止使用外部客户端提供的任意 JSONB 查询字符串进行 SQL 注入?

    我有一个由 PostgreSQL 数据库支持的基本 REST 服务 其中有一个包含各种列的表 其中之一是包含任意数据的 JSONB 列 客户端可以将数据填充存储在固定列中 并提供任何 JSON 作为存储在 JSONB 列中的不透明数据 我希
  • BeautifulSoup 3.1 解析器太容易崩溃

    我在使用 BeautifulSoup 解析一些不可靠的 HTML 时遇到了麻烦 事实证明 新版本中使用的 HTMLParser 的容忍度低于以前使用的 SGMLParser BeautifulSoup 有某种调试模式吗 我正在尝试找出如何阻
  • 截至 2013 年,IE8 的响应式设计范围是否值得考虑?

    我仍然在这里看到与使响应式设计适用于 IE8 或 IE7 相关的问题 由于缺乏对 Windows 相关设备的了解 我的第一反应是 由于今天仍然运行 IE8 的移动设备数量微不足道 因此不值得为 IE8 实现响应式设计 对于这个特定的浏览器
  • 获取 PL/SQL 集合中元素的索引

    是否有内置函数可以确定 PL SQL 集合中元素的 第一个 索引 就像是 DECLARE TYPE t test IS TABLE OF VARCHAR2 1 v test t test BEGIN v test NEW t test A
  • 使用 SVG 的部分边框/描边

    我正在使用 svg d3 创建由 矩形 元素组成的图表 为每个矩形添加部分边框 描边 仅在矩形顶部 的最佳方法是什么 Thanks 我不认为 SVG 支持仅描边矩形或路径的一部分 描边不像 CSS 边框 您还有其他一些选择 所有这些都需要一
  • node.js 本机插件 - 包装类的析构函数不运行

    我正在用 C 编写一个 Node js 插件 我使用 node ObjectWrap 包装一些类实例 以将本机实例与 JavaScript 对象关联起来 我的问题是 包装实例的析构函数永远不会运行 这是一个例子 point cc inclu
  • Java JDK中有并发List吗?

    如何创建一个并发 List 实例 在其中可以按索引访问元素 JDK 有我可以使用的类或工厂方法吗 ConcurrentLinkedQueue 如果您不关心基于索引的访问 而只想要列表的插入顺序保留特性 那么您可以考虑java util co
  • PostgreSQL 使用“lag()”窗口函数更新查询

    我有一个涉及Postgresql数据库的任务 我对 SQL 不太有经验 我有一张贸易产品每周营业额的表格 每周提供以下信息 产品 周数 周营业额 可能是正值或负值 具体取决于天气 更多产品被购买或出售 我添加了一栏 其中包含每周的期末余额
  • for循环中的appendChild只添加1个孩子

    在 JavaScript 中 我使用 HTML 表格创建一个网格 您在 Photoshop 中看到的网格类型 网格大小是可变的 即可以由用户更改 因此必须计算每个网格方块的大小并将其除以可用像素数以获得精确大小的网格 我已经完成了所有这些
  • NERDTree - 如何删除文件

    如何使用 NERDTree 删除文件 vim 插件页面 http www vim org scripts script php script id 1658 我已将其放入我的 vimrc file set modifiable 但我不知道删
  • JOGL/OpenGL VBO - 如何渲染顶点?

    3我有以下SceneRenderer类 实现GLEventListener 我想我了解创建缓冲区 存储指向这些缓冲区的指针以及用数据填充这些缓冲区的过程 请参阅 init 方法 我奋斗的地方是展示 方法 我几乎尝试了在互联网上找到的所有内容
  • gsub() 中超过 9 个反向引用

    如何使用超过 9 个反向引用的 gsub 我希望下面示例中的输出为 e g i j o gt test lt abcdefghijklmnop gt gsub w w w w w w w w w w w w w w w w 5 7 9 10
  • 使用 Javascript 进行 SVG 旋转

    我已经在 HTML 页面中创建了一个 SVG 图像 现在我想移动 SVG 形状以使用 JavaScript 按钮 我的应用程序的 JSFiddle 在这里 http jsfiddle net johndavies91 xwMYY http
  • 寻找关于 JIDE 的反馈 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 包装 np.arrays __pow__ 方法

    我只是重新审视我的一些代码以提高性能 并遇到了一些奇怪的事情 a np linspace 10 1000 1000000 reshape 1000 1000 timeit np square a 100 loops best of 3 8