首页 > 解决方案 > NumPy 中 out=... 参数和直接重新分配之间的区别

问题描述

以下两个np.dot对于方形数组会给出相同的结果x吗?

import numpy as np
x = np.arange(4 * 4).reshape(4, 4)
np.dot(x, x.T, out=x)  # method 1
x[:] = np.dot(x, x.T)  # method 2

谢谢。

为什么我问:

x += x.T不一样x += x.T.copy()

我不知道 np.dot 的内部是如何工作的。np.dot 是否同样将 out 参数视为视图?如果 out 是要相乘的矩阵之一,可以吗?

我使用的 numpy 来自 anaconda,它使用 mkl 作为后端。

标签: pythonarraysnumpy

解决方案


是的,它们是相同的,但在性能方面,我看到整数数组的有趣结果:

import perfplot

def f1(x):
    x = x.copy()
    np.dot(x, x.T, out=x)
    return x

def f2(x):
    x = x.copy()
    x[:] = np.dot(x, x.T)
    return x    

perfplot.show(
    setup=lambda n: np.arange(n * n).reshape(n, n),
    kernels=[f1, f2],
    labels=['out=...', 're-assignment'],
    n_range=[2**k for k in range(0, 9)],
    xlabel='N',
    equality_check=np.allclose
)

在此处输入图像描述

我曾经perfplot生成绘图时间。


对于浮点数组,绝对没有区别。

perfplot.show(
    setup=lambda n: np.arange(n * n).reshape(n, n).astype(float),
    kernels=[f1, f2],
    labels=['out=...', 're-assignment'],
    n_range=[2**k for k in range(0, 9)],
    xlabel='N',
    equality_check=np.allclose
)

在此处输入图像描述


推荐阅读