scipy - конструкция решетки, которая захватывает молекулы в двумерном измерении - PullRequest
2 голосов
/ 09 ноября 2011

это продолжение предыдущего вопроса stackoverflow здесь

Я хочу сделать это в двух измерениях. Я попробовал следующее:

for i in range(pos):
    steps=0   #the steps that the particle does until it falls in  a trap
    in_pos = sc.random.randint(0, len(grid), 2)
    initial_trap=False
    while initial_trap==False:
        #the step of the particle can be one of this
        step=sc.array(random.choice([[0, 1], [1, 0], [0, -1], [-1, 0]]))          
        # Check position for edges and fix if required

        if in_pos + step > sc.size(grid) - 1:
            in_pos = 0
        elif in_pos + step < 0:
            in_pos = sc.size(grid) - 1
        else:
            in_pos += step


        # Check if it's a trap in order to stop the loop

        if grid[in_pos] == 0:
            initial_trap = True

        # If it isn't a trap, continue
        steps+=1
    steps_count.append(steps)
return steps_count

Я тоже пробовал:

in_pos_x =int(sc.random.randint(0, len(grid), 1)) #initial position of particle in x axis
in_pos_y =int(sc.random.randint(0, len(grid), 1)) #initial position of particle in y axis

if  in_pos_x + step > len(grid)- 1 and in_pos_y + step > len(grid)-1:
    in_pos_x = 0
    in_pos_y = 0
elif in_pos_x + step < 0 and in_pos_y + step < 0:
    in_pos_x = len(grid)- 1
    in_pos_y = len(grid)- 1
else:    in_pos_x += step
    in_pos_y += step

if grid[in_pos_x][in_pos_y] == 0:
    initial_trap = True

И наконец, я пытался работать со списками, а не с массивами.

in_pos = (scipy.random.randint(0,len(grid),2)).tolist()
step=random.choice([[0, 1], [1, 0], [0, -1], [-1, 0]])

но безуспешно. Я здесь потерян!

--------------- Сообщения об ошибках -----------------------------

Если запустить программу, она выдаст мне:

'Значение истинности массива с более чем одним элементом неоднозначно. Используйте a.any () или a.all () 'в строке "if (in_pos + step)> sc.size (grid) - 1:"

Если я использую if sc.any(in_pos + step) > sc.size(grid) - 1: или if sc.any(grid[in_pos]) == 0:, он запускается, но я использовал print(grid[in_pos]), и я подумал, что он вообще не меняет значения! Он не получает значение «0», поэтому цикл никогда не заканчивается.

1 Ответ

3 голосов
/ 09 ноября 2011

После комментариев, я думаю, я понимаю, куда вы идете.

Полагаю, вы используете периодические границы, но проверка, которую вы делаете, как показано ниже, неверна:

# Check position for edges and fix if requireD

if in_pos + step > sc.size(grid) - 1:
    in_pos = 0
elif in_pos + step < 0:
    in_pos = sc.size(grid) - 1
else:
    in_pos += step

size возвращает общее количество элементов в массиве. Вам необходимо проверить отдельные длины (в направлениях x и y) массива. Здесь shape ваш друг. И вам нужно исправить индекс, который выходит за пределы, а не все из них. mod оператор % может быть полезен. Таким образом, приведенный выше код можно просто переписать так:

# Move by step
in_pos += step
# Correct according to periodic boundaries
in_pos = in_pos % grid.shape    # or simply in_pos %= grid.shape

Вторая проблема - индексация grid. Достаточно сказать, что вы делаете не то, что вам нужно ( проверьте документы для подробностей ). Для вашего простого случая его можно переписать так:

if grid[in_pos[0], in_pos[1]] == 0:
    initial_trap = True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...