>我正在尝试创建一个一维元胞自动机。对于给定的规则(介于 1 和 255 之间(,该数字将转换为相应的 8 位二进制数,并与 0 和 1 的所有 8 种可能组合配对。
除了将其放入函数中之外,代码似乎还可以正常工作。但是,当我运行后半部分时,它给了我属性错误:"列表"对象没有属性"形状"。我将"值"定义为 Numpy 数组,如果我在没有步进部分的情况下运行代码,它将保持为数组。我不确定发生了什么。任何指导将不胜感激!
def cellular_step(value, rule=110):
blist = np.unpackbits(np.uint8(rule))
truple = [(0,0,0),(0,0,1),(0,1,0),(0,1,1),(1,0,0),(1,0,1),(1,1,0),(1,1,1)]
lookup_dict = {}
for indx,lmr in enumerate(truple):
lookup_dict[lmr] = blist[indx]
next_step = np.array([],dtype=np.int8)
for i in range(value.shape[0]):
indices = range(i-1,i+2)
neighbourhood = value.take(indices,mode='wrap')
b = tuple(neighbourhood)
a = lookup_dict.get(b)
next_step = np.append(next_step,a)
return[next_step]
value = np.zeros(5, dtype=np.int8)
value[ len(value)//2 ] = 1
nsteps = 10
grid = np.ndarray( [nsteps,len(value)], dtype=np.int8)
for n in range(nsteps):
value = cellular_step(value,rule=30)
grid[n,:] = value
plt.imshow(grid)
在cellular_step
末尾,你返回了一个列表,然后分配给变量value
。因此value
不再是 Numpy 数组,因此没有属性shape
。
你为什么return[next_step]
?
做return next_step
是你正在寻找的先验。
我将"值"定义为 Numpy 数组,如果我在没有步进部分的情况下运行代码,它将保持为数组。
其实不然。看
>>> type(cellular_step(value, rule=30))
<type 'list'>