计算numpy数组中重复符号开关时的正确符号

3qpi33ja  于 2023-01-05  发布在  其他
关注(0)|答案(1)|浏览(100)

我试图在python中模拟一个自旋网格,它可以改变自旋的方向(用符号表示):

>>> import numpy as np
>>> spin_values = np.random.choice([-1, 1], (2, 2))
>>> spin_values
array([[-1,  1],
       [ 1,  1]])

然后,我抛出两组随机指数,表示自旋有一定的概率改变方向,比如:

>>> i = np.array([1, 1])
>>> j = np.array([0, 0])
>>> switches = np.array([-1, -1])

这里i和j包含可能改变和切换状态的索引,无论它们是切换(-1)还是保持它们的方向(1)。

>>> spin_values[i, j] *= switches

当自旋方向只改变一次时,这工作得很好。但是,当它应该改变两次(就像示例值一样)时,它只改变一次,因此给了我一个错误的结果。

>>> spin_values
array([[-1,  1],
       [-1,  1]])

如何在运行时间很短的情况下获得正确的结果(这必须在更大的网格上进行多次)?

rnmwe5a2

rnmwe5a21#

我将使用numpy.unique来获得唯一索引对的计数,并计算-1 ** n

idx, cnt = np.unique(np.vstack([i, j]), axis=1, return_counts=True)
spin_values[tuple(idx)] = (-1) ** cnt

更新了spin_values

array([[-1,  1],
       [ 1,  1]])

相关问题