Python - 使用大型 NumPy 数组难以计算分区函数

标签 python numpy physics

我使用 itertools、lambda 函数和大型 NumPy 数组以一种非常紧凑的方式计算类 Ising 模型的配分函数。给定一个由 N 节点和 Q“状态”/节点组成的网络,我有两个数组,h-fields 和 J-联轴器,尺寸分别为 (N,Q)(N,N,Q,Q)。然而,J 是上三角的。使用这些数组,我一直在使用以下方法计算分区函数 Z:

# Set up lambda functions and iteration tuples of the form (A_1, A_2, ..., A_n)
iters = itertools.product(range(Q),repeat=N)
hf = lambda s: h[range(N),s]
jf = lambda s: np.array([J[fi,fj,s[fi],s[fj]] \
                            for fi,fj in itertools.combinations(range(N),2)]).flatten()

# Initialize and populate partition function array
pf = np.zeros(tuple([Q for i in range(N)]))
for it in iters:
    hterms = np.exp(hf(it)).prod()
    jterms = np.exp(-jf(it)).prod()
    pf[it] = jterms * hterms

# Calculates partition function
Z = pf.sum()

此方法适用于小的 NQ,比如 (N,Q) = (5,2)。但是,对于较大的系统 (N,Q) = (18,3),由于内存问题,此方法甚至无法创建 pf 数组,因为它具有 Q ^N 非平凡元素。关于如何克服此内存问题或如何更改代码以在子数组上工作的任何想法?

编辑:在jf 的定义中犯了一个小错误。已更正。

最佳答案

您可以通过将 Z 初始化为 0 并在每次迭代中将其递增 jterms * iterms 来避免大型数组。但是,这仍然不能使您摆脱 Q^N 数字的计算和求和。为此,您可能需要想出一种方法来简化分区函数的代数运算。

关于Python - 使用大型 NumPy 数组难以计算分区函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12373894/

相关文章:

python - Python 中的二阶导数 - scipy/numpy/pandas

android - 以角度和速度应用于 Sprite 的脉冲

python - 使用类反转 python 中的字符串数组

python - numpy 交换数组中的多个元素

python - 如何平滑对齐文本输出

python - Pandas 通过时间戳的接近程度来分组

python - numpy中的一维逆离散傅里叶变换是如何计算的?

python - 如何从多个简单数组制作结构化数组

math - 寻找二维空间中点的时间限制路径

c# - 简单的二维火箭动力学