`numpy.dot`中的数组顺序

15 投票
1 回答
1562 浏览
提问于 2025-04-16 17:58

在Python的数值库NumPy中,numpy.dot函数是如何处理不同内存顺序的数组的?比如numpy.dot(c-order, f-order)dot(f-order, c-order)等。

我之所以问这个问题,是因为很久以前(大概是numpy 1.0.4版本?),我做了一些测试,发现numpy.dot的性能比直接调用scipy.linalg中的dgemm要差,尽管它们内部都调用了同一个BLAS库。我怀疑原因是numpy.dot在处理输入矩阵时进行了复制,如果输入矩阵很大,这就很糟糕了。

现在我又试了一次,发现其实numpy.dot的性能和dgemm是一样的,所以没有必要再手动设置数组的特定顺序和转置标志。这样代码看起来更简洁。

所以我的问题是,最近的(比如1.6.0版本)numpy.dot是怎么工作的?什么时候会进行复制,什么时候又不会?我主要关心的是1)内存 2)性能。谢谢。

1 个回答

1

你看到的情况可能和一个叫做blas优化的点积导入错误有关,这个错误被悄悄处理了(这段代码来自numeric.py)。

# try to import blas optimized dot if available
try:
    # importing this changes the dot function for basic 4 types
    # to blas-optimized versions.
    from _dotblas import dot, vdot, inner, alterdot, restoredot
except ImportError:
    # docstrings are in add_newdocs.py
    inner = multiarray.inner
    dot = multiarray.dot

撰写回答