【问题标题】:How to vectorize passing a function to two numpy arrays: 3D and 2D?如何矢量化将函数传递给两个 numpy 数组:3D 和 2D?
【发布时间】:2018-12-12 21:07:37
【问题描述】:

我有两个多维 numpy 数组:x 是 3D,y 是 2D。

如果我有一个函数foo(a, b),它将两个二维数组作为输入,我如何将我的多维数组传递给foo,并以矢量化方式迭代x的第三维以获得一个foo的结果列表?

我一直在尝试使用 np.vectorize 执行此操作,但它会遍历数组的行并产生错误,所以我被卡住了。

【问题讨论】:

  • 即使它有效 np.vectorize 也不会提供任何速度改进。如果你不能重写foo,那就很难击败迭代:foo(a[:,:,i], b]

标签: python python-3.x numpy vectorization


【解决方案1】:

您可以使用signature 关键字指定函数的签名。但是,这将尝试使用每个输入的最后一个维度,因此您必须手动转置。示例

F = np.vectorize(np.matmul, signature='(m,n),(n,l)->(m,l)', otypes=(float,))
A = np.arange(12).reshape(2, 2, 3)
B = np.diag((1.5, 2.5))
# F(A.transpose(2,0,1), B)
# array([[[ 0. ,  7.5],
#         [ 9. , 22.5]],
# 
#        [[ 1.5, 10. ],
#         [10.5, 25. ]],
#
#        [[ 3. , 12.5],
#         [12. , 27.5]]])

正如@hpaulj 在 cmets 中指出的那样,vectorize 是一种便利功能,而不是性能增强器。

【讨论】:

    猜你喜欢
    • 2015-02-21
    • 2022-01-03
    • 2015-11-14
    • 1970-01-01
    • 2019-09-11
    • 2016-10-31
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多