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