如何在Python中正确应用赋值运算符?

时间:2018-01-05 13:56:34

标签: python numpy

我必须在大型数组上进行一些数学运算(例如,加,乘)。 为了防止任何' 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

欢迎任何帮助。

3 个答案:

答案 0 :(得分:1)

产生差异是因为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中迭代这么大的数组元素的性能开销非常大。

答案 1 :(得分:0)

您的问题是您实际执行的是矩阵乘法运算。 在您的情况下,您想要的是以下内容:

(LocalDb)\MSSQLLocalDb

答案 2 :(得分:0)

试试这个

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

它提供输出

array([[ 0.        ,  0.70189037,  0.36261843],
       [ 0.70189037,  0.        ,  0.42885459],
       [ 0.36261843,  0.42885459,  0.        ]])