Применение моей функции к каждой позиции в массиве Numpy

#function #numpy #mapping #montecarlo #map-function

Вопрос:

Я пытаюсь применить свою функцию CasinoTime к каждой позиции в моем массиве за развертку. В настоящее время функция выполняет это, но выбирает позицию случайным образом и может выполнять только одну позицию за развертку. Результат выглядит примерно так:

 Starting Configuration: [[ 1 -1 1 1 -1 -1 1 1 1 -1]] 0: [[ 1 -1 1 1 -1 -1 1 1 1 -1]] Energy: [-2] Spin: 0.2 1: [[ 1 -1 1 1 1 -1 1 1 1 -1]] Energy: [[-10]] Spin: 0.4 2: [[ 1 -1 1 1 1 -1 1 1 1 -1]] Energy: [[-10]] Spin: 0.4 3: [[-1 -1 1 1 1 -1 1 1 1 -1]] Energy: [[-2]] Spin: 0.2  

Как вы можете видеть, он изменяет только одну позицию за раз. В идеале моя функция будет проходить через каждую позицию в моем массиве (за развертку) и изменять значения, соответствующие критериям. Это моделирование алгоритма Монте-Карло/Метрополиса. Я попытался использовать функцию карты для применения моей функции к моему массиву, однако это, похоже, не работает. Любая помощь будет очень признательна, и я приложил свой код ниже!

 import numpy as np  N = 10 J = 1 H = 2   def calcEnergy(config, J, H):  energy = 0  for i in range(config.size):  spin = config[i]  neighbour = config[(i   1) % N]  energy = energy - J * (spin * neighbour) - H * neighbour  return energy   def ChangeInEnergy(J, H, spin, spinleft, spinright):  dE = 2 * H * spin   2 * J * spin * (spinleft   spinright)  return dE   def CasinoTime(sweeps, beta, J, H, debug=False):  config = np.random.choice([-1, 1], (N, 1))  averagespins = []   if debug is True:  print("Starting Configuration:", (np.transpose(config)))  runningenergy = calcEnergy(config, J, H)   for i in range(sweeps):  spinlocation = np.random.randint(N)  spin = config[spinlocation]   spinright = config[(spin   1) % N]  spinleft = config[(spin - 1) % N]   dE = ChangeInEnergy(J, H, spin, spinleft, spinright)   r = np.random.random()   if r lt; min(1, np.exp(-beta * dE)):  config[spinlocation] *= -1  runningenergy = runningenergy   dE  else:  pass   averagespin = config.mean()   if debug and i % 1 == 0:  print("%i: " % i, np.transpose(config), "Energy:", runningenergy, "Spin:", averagespin)   return averagespins   averagespins = CasinoTime(sweeps=20, beta=0.1, J=1, H=2, debug=True)