当前位置: 首页 > 面试题库 >

如何将numpy.linalg.norm应用于矩阵的每一行?

古凌
2023-03-14
问题内容

我有一个2D矩阵,我想对每一行进行规范。但是当我numpy.linalg.norm(X)直接使用时,它将采用整个矩阵的范数。

我可以使用for循环对每一行进行规范,然后对each进行规范X[i],但是由于我有3万行,因此这需要花费大量时间。

有什么建议可以找到更快的方法吗?还是可以将其应用于np.linalg.norm矩阵的每一行?


问题答案:

请注意,如perimosocordiae所示,从NumPy1.9版本开始,这np.linalg.norm(x, axis=1)是计算L2-范数的最快方法。

由于numpy更新而复活了一个旧问题。从1.9版本开始,numpy.linalg.norm现在接受一个axis参数。[代码,文档]

这是镇上最快的新方法:

In [10]: x = np.random.random((500,500))

In [11]: %timeit np.apply_along_axis(np.linalg.norm, 1, x)
10 loops, best of 3: 21 ms per loop

In [12]: %timeit np.sum(np.abs(x)**2,axis=-1)**(1./2)
100 loops, best of 3: 2.6 ms per loop

In [13]: %timeit np.linalg.norm(x, axis=1)
1000 loops, best of 3: 1.4 ms per loop

并证明它正在计算同一件事:

In [14]: np.allclose(np.linalg.norm(x, axis=1), np.sum(np.abs(x)**2,axis=-1)**(1./2))
Out[14]: True

如果要计算L2范数,则可以直接计算(使用自axis=-1变量沿行求和):

np.sum(np.abs(x)**2,axis=-1)**(1./2)

Lp-范数当然可以类似地计算。

它的速度比快得多np.apply_along_axis,尽管可能不那么方便:

In [48]: %timeit np.apply_along_axis(np.linalg.norm, 1, x)
1000 loops, best of 3: 208 us per loop

In [49]: %timeit np.sum(np.abs(x)**2,axis=-1)**(1./2)
100000 loops, best of 3: 18.3 us per loop

其他ord形式的norm也可以直接计算(具有类似的加速比):

In [55]: %timeit np.apply_along_axis(lambda row:np.linalg.norm(row,ord=1), 1, x)
1000 loops, best of 3: 203 us per loop

In [54]: %timeit np.sum(abs(x), axis=-1)
100000 loops, best of 3: 10.9 us per loop


 类似资料:
  • 在处理过程中,当您应用矩阵变换时,您可以在画布上绘制,而不必担心x-y坐标的“真实”位置。 我认为按照同样的逻辑,我可以通过使用parentapplet.get(x,y,width,height)复制画布的一部分,它会自动移动x和y,但它不会,它使用坐标作为原始输入,而不对其应用矩阵堆栈。 因此,我认为处理这个问题的最简单方法是手动将矩阵堆栈应用于x、y、width和height值,并将结果用作g

  • 我想在Python中生成一个小于或等于另一个矩阵的随机0-1矩阵。例如,我有一个特定的矩阵: 我想生成一个随机矩阵: 正如我们所看到的,A>=Y。我如何在Python中生成随机矩阵y?

  • 问题内容: 我想将图像的颜色基础从RGB更改为其他颜色。我有一个要应用于每个像素的RGB的矩阵M,我们可以将其定义为x ij。 我目前正在迭代NumPy图像的每个像素并手动计算Mx ij。我什至无法对它们进行矢量化处理,因为RGB是1x3而不是3x1数组。 有一个更好的方法吗?也许是OpenCV或NumPy中的函数? 问题答案: 记不清执行此操作的规范方法(可能避免了转置),但这应该可行: 如果是

  • 我有一个矩阵,我想和另外两个矩阵进行比较,看看我矩阵中的每个条目是包含在另外两个矩阵的值之内还是之外。例如,如果我的矩阵是: 另外两个矩阵是L和U: 和 我想取M的每个条目,比较一下它是否包含在L和U对应条目的范围内。 例如,对于M[1,1],它在-0.49416022和-0.84996737的范围之外,所以我将给这个比较赋值0。另一方面,对于M[2,3],值是-0.5240536,因此在1.14

  • 我有一个有三个带的光栅和一个有三个列的矩阵。 我想找到y的每一行和r的每一个单元格之间的角度。 我可以通过以下方式将光栅转换为矩阵: 现在,每个has矩阵都具有相同的形状(每个has矩阵中有3列,每行作为一个像素或来自y的样本)。我已经研究过如何使用嵌套的apply()函数,但老实说,我不理解语法,因此无法使其正常工作。 我有40个非常大的超光谱光栅(425个波段)和一个50行矩阵,我需要使用它来

  • 我目前正在做一个音频信号处理项目,需要在Java中的一个复杂矩阵上使用SVD。我当前的线性代数库是Apache Commons。但它只提供实矩阵的SVD,JAMA、JBLAS、EJML、ojAlgo都不支持复杂的SVD。 我一直在用一些技巧从一个等效的实矩阵中找到SVD。然而,当我重建矩阵时,这种技术对于虚部有很大的不准确性。