代码之家  ›  专栏  ›  技术社区  ›  mzzx

numpy-矢量化函数:在\u轴上应用\u/沿\u轴应用\u

  •  3
  • mzzx  · 技术社区  · 6 年前

    我想计算m的行列式 m*n维数组,并希望以一种快速/更优雅的方式来实现这一点。蛮力方法有效:

    import numpy as n
    
    array=n.array([[[0.,1.,2.,3.],[2,1,1,0]],[[0.5, 0.5,2,2],[0.5,1,0,2]]])
    detarray=n.zeros(4)
    for i in range(4):
        detarray[i]= n.linalg.det(array[:,:,i])
    

    我本想用apply\沿\轴来做这件事,但我知道这只适用于函数的1D参数,所以我想我不能让它工作。

    但是,我认为在\u轴上应用\u也应该起作用:

    n.apply_over_axes(n.linalg.det, array, [0,1])
    

    但这给了我一个错误:

    有人知道为什么这样不行吗?如果这种类型的计算真的不可能用apply\u over\u轴,有没有比for循环更好的方法呢?

    2 回复  |  直到 6 年前
        1
  •  2
  •   kmario23 Mazdak    6 年前

    利用 transpose semantics of NumPy numpy.linalg.det() 例如:

    In [13]: arr = np.array([[[0.,1.,2.,3.], 
                              [2, 1, 1, 0]], 
    
                             [[0.5, 0.5,2,2],
                              [0.5, 1, 0, 2]]])
    
    In [14]: np.linalg.det(arr.T)
    Out[14]: array([-1. ,  0.5, -2. ,  6. ])
    

    从性能角度来看,这种方法似乎是可行的 快一倍 另一种方法是使用 numpy.moveaxis

    In [29]: %timeit np.linalg.det(np.moveaxis(arr, 2, 0))
    12.9 µs ± 192 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    
    In [30]: %timeit np.linalg.det(arr.T)
    6.2 µs ± 136 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    
        2
  •  1
  •   Paul Panzer    6 年前

    numpy.linalg.det 是矢量化的开箱即用。只需将外轴向左移动:

    >>> np.linalg.det(np.moveaxis(array, 2, 0))
    array([-1. ,  0.5, -2. ,  6. ])
    
    推荐文章