我必须在大型数组上执行一些数学运算(例如加法,乘法)。
为了防止出现任何'MemoryError',我正在按照此thread的答案中的建议进行计算。

但是,按照线程中的建议应用赋值操作时,我遇到了一些麻烦。我将使用小型3x3阵列演示我的问题。

我有以下输入数组K

array([[ 0.        ,  0.51290339,  0.24675368],
       [ 0.51290339,  0.        ,  0.29440921],
       [ 0.24675368,  0.29440921,  0.        ]])


我想将以下计算应用于输入数组K

output = K* (1.5 - 0.5 * K* K)


我将上述等式应用到Python中,如下所示计算所需的输出:

K*= (1.5+np.dot(np.dot(-0.5,K),K))


但是,输出答案不正确。

我想要的答案应该是:

0.0000000 0.7018904 0.3626184
0.7018904 0.0000000 0.4288546
0.3626184 0.4288546 0.0000000


欢迎任何帮助。

最佳答案

之所以会出现差异,是因为dot计算点积,而*计算按元素乘积。尝试使用

K *= 1.5 - 0.5 * K * K


代替。

加成

不幸的是,这还不能解决内存问题。我建议使用cython来计算所需的函数而无需分配额外的内存。

# This cython function must be compiled
def evaluate_function_inplace(double[:] values):
    cdef int i
    for i in range(values.shape[0]):
        values[i] *= 1.5 - 0.5 * values[i] * values[i]


随后,您可以使用类似的功能。

K = ...
evaluate_function_inplace(K.ravel())


K.ravel()调用将使数组变平,但不会分配新的内存。

当然,您也可以不使用cython来使用上述方法,但是在python中对如此大数组的元素进行迭代的性能开销非常大。

关于python - 如何在Python中正确应用赋值运算符?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48115074/

10-12 16:30
查看更多