我编写了一个函数,该函数应该使用嵌套列表来递归地创建包含值的n维数组,表面上是。 (Dimensions是具有数组n维尺寸的元组,即(3,3,3)是3x3x3数组)。但是,我的函数创建的数组在分配时遇到问题,因为它们无法将值分配给单个索引,而又不将该值分配给其他嵌套列表。而且奇怪的是,当我声明一个具有相同维数和值的数组但使用一行嵌套列表时,即使python声明对象相等,使用“手动”数组进行分配也可以正常工作。
def createboard(dimensions,value):
if dimensions[1:]:
return dimensions[0]*[createboard(dimensions[1:],value)]
else:
return dimensions[0]*[value]
example = createboard((3,3,2),0)
print(example)
manual = [[[0, 0], [0, 0], [0, 0]],
[[0, 0], [0, 0], [0, 0]],
[[0, 0], [0, 0], [0, 0]]]
print(manual == example)
example[1][1][0] = True
print('example =', example)
manual[1][1][0] = True
print('example =', manual)
输出:
[[[0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0]]]
True
example = [[[True, 0], [True, 0], [True, 0]], [[True, 0], [True, 0], [True, 0]], [[True, 0], [True, 0], [True, 0]]]
example = [[[0, 0], [0, 0], [0, 0]], [[0, 0], [True, 0], [0, 0]], [[0, 0], [0, 0], [0, 0]]]
感谢您的帮助。
答案 0 :(得分:0)
简短答案:替换:
return dimensions[0]*[createboard(dimensions[1:],value)]
具有:
return [createboard(dimensions[1:],value) for _ in range(dimensions[0])]
请注意,前者仅进行一个递归调用,而后者进行dimensions[0]
个递归调用,这要贵得多;但是后者实际上创建了dimensions[0]
个不同的列表,而不是多次重复使用同一列表。
详细说明: List of lists changes reflected across sublists unexpectedly
答案 1 :(得分:0)
调用该函数后,您可以完成
import numpy as np
example = np.array(example,copy=True).tolist()
这是因为您正在重复使用同一对象进行计算。但是,在这种情况下,您可以通过将numpy本身与
一起使用来替换原始的createboardimport numpy as np
example = np.ones(dimensions)*value