在python中将1d数组转换为2d矩阵

时间:2016-03-15 19:44:49

标签: python matrix

我正在制作地图编辑器,您可以在其中选择XY的尺寸。

在我的例子中,我将使用6x6板。使用Tkinter,我的值存储在字典中,并以这种格式出现在数组中:

{(0,"floor"), (1,"floor"), (2,"wall"), ..., (35,"wall")} 

我想要做的是使用二维数组格式的值:

{([0,0],"floor"),([0,1],"floor"), ([0,2],"wall"), ..., ([5,5],wall)}

这是我正在尝试的草案代码,但似乎并不像我想要的那样工作:

valueX = 6
valueY = 6 
totalSize = valueX * valueY 
matrix = []

for i in range(totalSize): 
    matrix.append([i/valueX,i%valueY])

这适用于6x6矩阵,但是当我尝试像6x10这样的不规则大小时,它无法获得我想要的结果。

这是我想要的结果:

[0,0] [0,1]...[0,9],[0,10],[1,0]...

这是我得到的:

[[0, 0], [0, 1], [0, 2], [0, 3], [0, 4], [0, 5], [1, 6], [1, 7], [1, 8], [1, 9], [1, 0], [1, 1]]

3 个答案:

答案 0 :(得分:1)

您对坐标的计算不正确 - 我相信这应该会更好:

matrix.append([i/valueY, i%valueY])

第一个坐标需要是你的X值,对于列表中的每个“valueY”元组,它将递增一次,因此除以valueY。

第二个坐标需要是你的Y值,它在0到valueY-1的范围内,所以i modulo valueY负责处理。

我认为代码是一个简化的例子,因为它根本不会尝试处理源数据元组。

答案 1 :(得分:0)

我同意马特乔丹的观点。只需确保您确保这些操作的int输出:

    matrix.append([int(i/valueY), i%valueY])

,Python 3会给你带来问题(如果你导入除法,甚至是2.x)。此外,您始终可以按照更“直观”的方式构建此类可迭代(尽管速度较慢):

    matrix = []
    for x in range(valueX):
        for y in range(valueY):
            matrix.append([x,y])

如果要先行X和Y秒行,可以更改循环的顺序。

答案 2 :(得分:0)

首先,让我们清楚一些事情。 Python中没有键的字典称为set。在REPL:

>>> x = {1,2,3}
>>> x
{1, 2, 3}

>>> x = {1,2,3,1}
>>> x
{1, 2, 3}

我们可以看到一个集合将删除重复的项目。当我们谈论集合时,我们必须要小心(最常见的是没有排序,没有重复),当我们讨论lists(有订单并且可以包含重复项)时。

其次,“二维数组”隐含地指示元素在二维平面中的存在位置(通常称为“矩阵”):

>>> y = [['a','b','c'],['d','e','f']]
>>> y[0][1]
'b'
>>>y[1][0]
'd'

这与您正在构建的内容略有不同:

>>> z = [([0,0], 'a'), ([0,1], 'b'), ([0,2], 'c'), ([1,0], 'd'), ([1,1], 'e'), ([1,2], 'f')]
>>> z[1]
([0, 1], 'b')
>>> z[3]
([1, 0], 'd')

因此非常重要确定您希望函数执行的操作。之一:

f(list of tuples) -> (list of tuples, with each tuple being tagged with it's coordinate)

或者:

f(list of tuples) -> (list of list of tuples, with each tuple having it's original index)

如果是前者:

new_list = list()
xDimension = 6
yDimension = 6  # Not actually used!
for (idx, element) in original_list:
    y = int(idx / valueX)  # rounds down
    x = idx % valueX
    new_list.append(([x,y], element))

请注意,上面没有列表长度不匹配的问题。无论原始列表是否“适合”所需的矩阵大小,每个元组都将使用坐标进行标记。此外,如果它太短,则不会出现错误。这是因为我们只是遍历原始列表。

如果是后者:

xDimension = 6
yDimension = 6
matrix = list()
for y in range(yDimension):
    row = list()
    for x in range(xDimension):
        idx = y*xDimension + x
        row.append(original_list[idx])
    matrix.append(row)

如果空间不足,matrix可能不包含原始列表中的所有元素。但是,它会将元组排列成所需大小的多维数组。