循环并更新数组值,直到满足条件,或直到完成100个循环为止



在jupyter笔记本上在python 3.7中工作。我正在研究一个项目,该项目将循环遍历2D numpy数组("板",如果您愿意的话)检查数字1的所有实例。当它找到数字1时,我需要它检查左侧的值,右,上方,下方。如果旁边的任何值是2,则该元素本身将变为2。

循环遍历整个数组,我将需要代码来检查板从单个循环的开头是否完全更改。如果没有更改,则模拟(循环)应结束。但是,如果已更改,则模拟应再次运行。但是,模拟不应循环超过100圈。

这是导致我的问题电池的设置:

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import numpy.random as rand
import time
from IPython.display import display, clear_output
def set_board(height=5,width=10,density=.75):
    city = np.zeros((height,width),dtype='int64')
    for i in range(height):
        for j in range(width):
            if rand.random() <= density:
                city[i,j] = 1
    return city
def VisMap(Map=set_board(),Colors=plt.cm.RdYlGn):
    MapVis = plt.imshow(Map, Colors)
    return MapVis
def onBoard(i, j, array):
    if (i >= 0 and i < array.shape[0]-1 
        and j >= 0 and j < array.shape[1]-1):
        return True
    return False
def getNeighborValues(i, j, board):
    neighborhood_indices = [(i-1,j),(i,j-1),(i+1,j),(i,j+1)]
    neighborhood_values = []
    for index in neighborhood_indices:
        if onBoard(index[0],index[1],board) == True:
            neighborhood_values.append(board[index[0],index[1]])
        pass
    return neighborhood_values
def startRumor(board):
    height, width = board.shape 
    height_quarters = int(height/4)
    width_quarters = int(width/4)
    starting_middle_height_index = height_quarters
    ending_middle_height_index = 3*height_quarters
    starting_middle_width_index = width_quarters
    ending_middle_width_index = 3*width_quarters
    found_starting_point = False 
    if np.all(board[starting_middle_height_index:ending_middle_height_index, starting_middle_width_index:ending_middle_width_index] == 0):
        i = rand.randint(starting_middle_height_index, ending_middle_height_index)
        j = rand.randint(starting_middle_width_index, ending_middle_width_index)
        board[i,j] = 2
        found_starting_point = True
    while not found_starting_point:
        i = rand.randint(starting_middle_height_index, ending_middle_height_index)
        j = rand.randint(starting_middle_width_index, ending_middle_width_index)
        if board[i,j] == 1:
            found_starting_point = True
            board[i, j] = 2

这是我有问题的单元格(特别是从步骤5开始):

#Step 1: Initializing my board
StartingBoard = set_board(100,200,.4)
#Step 2: Visualizing my board
PreRumorVis = VisMap(StartingBoard)
#Step 3: Starting the rumor
startRumor(StartingBoard)
#Step 4: Visualizing the board after the rumor has started
PostRumorVis = VisMap(StartingBoard)
#Step 5: Create a copy of the city, and turn anything 
#with a 2 around it into a 2, and keep doing that for 100 
#loops. Or, if the city at the end of the loop is equal to 
#the one from the beginning of the loop, break it. If there 
#is some change, though, set the new city to now be the 
#updated copy, and loop through again. (In this case, it 
#probably should loop all 100 times).
City_Copy = StartingBoard.copy()
New_City = City_Copy.copy()
iterations = 0
for num in range(100):
    for i in range(City_Copy.shape[0]):
        for j in range(City_Copy.shape[1]):
            if City_Copy[i,j] == 1:
                if 2 in getNeighborValues(i,j, City_Copy):
                    New_City[i,j] = 2
                else:
                    New_City[i,j] = 1
    if np.array_equal(New_City, City_Copy) == True:
        break
    else:
        City_Copy = New_City.copy()
        iterations += 1
print("This rumor has been around for", iterations, "days.")            
New_City

编辑:由于一位评论者,我发现我一开始就缺少复制功能。但是,我仍然有大约18天的时间,应该是100(或非常接近)。想知道我是否应该以for循环或段循环打开。问题可能在于将变量设置为等于副本的某个地方。...这对我有些困惑。从逻辑上讲,这一切都很有意义,但是某处有一个螺丝。

在Python中,分配语句不复制对象,而是在目标和对象之间创建绑定。当我们使用=运算符时,用户认为这会创建一个新对象,嗯,不是。它仅创建一个新变量,该变量共享原始对象的引用。

示例: -

>>> a=np.array([[0,1],[0,2]])
>>> b=a
>>> np.array_equal(b,a)
True
>>> b[0][1]=1
>>> b
array([[0, 1],
       [0, 2]])
>>> a
array([[0, 1],
       [0, 2]])
>>> np.array_equal(b,a)
True

这是由于浅复制的事实而发生的。浅复制仅限于复合对象,例如列表。以避免进行深层复制。

>>> import copy
>>> a=np.array([[0,1],[0,2]])
>>> b=copy.deepcopy(a) 
>>> np.array_equal(b,a)
True
>>>b[0][0]=1
>>> np.array_equal(b,a)
False

解决方案: -

由于您已分配了new_city = city_copy,无论完成新_City的更改,因此在city_copy中反映了。增量。尝试使用DeepCopy解决此问题。

参考: -

  1. 浅副本与深复制

相关内容

最新更新