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