numpy的数组对象转换为列表对象的功能?

时间:2018-10-09 07:00:28

标签: python arrays cellular-automata

我正在尝试创建一维元胞自动机。对于给定的规则(介于1到255之间),该数字将转换为相应的8位二进制数字,并与0和1的所有8种可能组合配对。

该代码在将其放入函数之外似乎可以正常工作。但是,当我运行下半部分时,它给了我AttributeError:'list'对象没有属性'shape'。我将“值”定义为一个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)

2 个答案:

答案 0 :(得分:0)

cellular_step的末尾,您返回了一个列表,然后将其分配给变量value。因此value不再是Numpy数组,因此没有属性shape

答案 1 :(得分:0)

您为什么return[next_step]

return next_step是您所寻找的先验。


  

我将“值”定义为一个Numpy数组,并且如果我运行没有步进部分的代码,则它将作为数组保留。

实际上不是。看到

>>> type(cellular_step(value, rule=30))
<type 'list'>