【问题标题】:Raise array to the power of another array - i.e. expanding the dimension of the array将数组提升到另一个数组的幂 - 即扩展数组的维度
【发布时间】:2020-03-22 06:41:50
【问题描述】:

是否可以使用 numpy 将一个数组提升到另一个数组的幂,以一种产生比输入更大维度的结果的方式 - 即不仅仅是简单的元素方式提升到幂。

作为一个简单的示例,我希望计算以下内容。下面是“速记”形式 - 实际上这是通过在大型 x 数组上循环实现的,因此速度很慢。

x = np.arange(4)
t = np.random.rand(3,3)

y = np.empty_like(x)
y[0] = np.sum(x[0]**t)
y[1] = np.sum(x[1]**t)
y[2] = np.sum(x[2]**t)
y[3] = np.sum(x[3]**t)

我想要一个矢量化的解决方案来代替每次都做y[i]。但是,由于 x 的形状为 [4] 而 y 的形状为 [3,3],所以当我尝试计算 x**t 时出现错误。

有没有快速优化的解决方案?

【问题讨论】:

  • 好的,谢谢。抱歉耽搁了,因为我正在测试它。工作得很好,谢谢 - 代码非常干净! numexpr 在我的情况下实际上需要更长的时间,这可能取决于计算机。

标签: python arrays performance numpy matrix


【解决方案1】:

直接的矢量化方式是broadcasting -

y = (x[:,None,None]**t).sum((1,2)).astype(x.dtype)

或者使用内置的np.power.outer -

y = np.power.outer(x,t).sum((1,2)).astype(x.dtype)

对于大型阵列,利用带有numexpr 模块的多核 -

import numexpr as ne

y = ne.evaluate('sum(x3D**t1D,1)',{'x3D':x[:,None],'t1D':t.ravel()}).astype(x.dtype)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-16
    • 2023-03-12
    • 2021-12-31
    • 2011-07-09
    • 2019-08-20
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多