Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 简单矩阵类型旋转(无numpy或pandas)_Python - Fatal编程技术网

Python 简单矩阵类型旋转(无numpy或pandas)

Python 简单矩阵类型旋转(无numpy或pandas),python,Python,这一定很简单,但我无法解决 我想使用本机python列表进行矩阵类型的转置(即,不使用numpy或pandas)。代码如下所示。我很难找出哪里错了 raw_matrix_list = [[1, 0, 1, 0, 1, 0], [1, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 1, 1]] def rotate_matrix_l

这一定很简单,但我无法解决

我想使用本机python列表进行矩阵类型的转置(即,不使用
numpy
pandas
)。代码如下所示。我很难找出哪里错了

raw_matrix_list = [[1, 0, 1, 0, 1, 0],
                   [1, 0, 0, 0, 1, 0],
                   [0, 0, 0, 0, 0, 1],
                   [1, 0, 0, 0, 1, 1]]

def rotate_matrix_list(raw_matrix_list):
    rows = len(raw_matrix_list)
    cols = len(raw_matrix_list[0])
    new_matrix_list = [[0] * rows] * cols
    for ii in xrange(cols):
        for jj in xrange(rows):
#             print str(ii) + ', ' + str(jj) + ', ' + str(rows)
            new_matrix_list[ii][jj] = raw_matrix_list[rows-jj - 1][ii]
    return(new_matrix_list)

rotate_matrix_list(raw_matrix_list)
我得到的结果是

[[1, 1, 0, 0], [1, 1, 0, 0], [1, 1, 0, 0], [1, 1, 0, 0], [1, 1, 0, 0], [1, 1, 0, 0]]
我想得到的是:

[[1, 0, 1, 1], [0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 0, 0], [1, 0, 1, 1], [1, 1, 0, 0]]
===

Python 2.7.12::Anaconda 2.3.0(x86_64)

===

更新2
现在,我得到了如何在python中使用
zip
函数实现的答案。但我就是不明白为什么我的代码不起作用

在Python中使用普通列表进行转置非常简单:使用
zip
和splat操作符:

>>> raw_matrix_list = [[1, 0, 1, 0, 1, 0],
...                    [1, 0, 0, 0, 1, 0],
...                    [0, 0, 0, 0, 0, 1],
...                    [1, 0, 0, 0, 1, 1]]
>>> transpose = list(zip(*raw_matrix_list))
>>> transpose
[(1, 1, 0, 1), (0, 0, 0, 0), (1, 0, 0, 0), (0, 0, 0, 0), (1, 1, 0, 1), (0, 0, 1, 1)]
>>> from pprint import pprint
>>> pprint(transpose)
[(1, 1, 0, 1),
 (0, 0, 0, 0),
 (1, 0, 0, 0),
 (0, 0, 0, 0),
 (1, 1, 0, 1),
 (0, 0, 1, 1)]
对于Python2,您只需要
zip(*raw\u matrix\u list))
而不需要
list(zip(*raw\u matrix\u list))

如果元组列表不起作用:

>>> transpose = [list(t) for t in zip(*raw_matrix_list)]
>>> pprint(transpose)
[[1, 1, 0, 1],
 [0, 0, 0, 0],
 [1, 0, 0, 0],
 [0, 0, 0, 0],
 [1, 1, 0, 1],
 [0, 0, 1, 1]]
您的解决方案的问题在于您使用了:

new_matrix_list = [[0] * rows] * cols
这使得每个列表都是相同的对象。 有关问题,请参见此示例:

>>> x = [[0]*3] * 4
>>> x
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> x[0][0] = 1
>>> x
[[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0]]
使用类似于:

new_matrix_list = [[0 for _ in range(rows)] for _ in range(cols)]

您应该已经准备好了。

在Python中使用普通列表进行转置非常简单:使用
zip
和splat操作符:

>>> raw_matrix_list = [[1, 0, 1, 0, 1, 0],
...                    [1, 0, 0, 0, 1, 0],
...                    [0, 0, 0, 0, 0, 1],
...                    [1, 0, 0, 0, 1, 1]]
>>> transpose = list(zip(*raw_matrix_list))
>>> transpose
[(1, 1, 0, 1), (0, 0, 0, 0), (1, 0, 0, 0), (0, 0, 0, 0), (1, 1, 0, 1), (0, 0, 1, 1)]
>>> from pprint import pprint
>>> pprint(transpose)
[(1, 1, 0, 1),
 (0, 0, 0, 0),
 (1, 0, 0, 0),
 (0, 0, 0, 0),
 (1, 1, 0, 1),
 (0, 0, 1, 1)]
对于Python2,您只需要
zip(*raw\u matrix\u list))
而不需要
list(zip(*raw\u matrix\u list))

如果元组列表不起作用:

>>> transpose = [list(t) for t in zip(*raw_matrix_list)]
>>> pprint(transpose)
[[1, 1, 0, 1],
 [0, 0, 0, 0],
 [1, 0, 0, 0],
 [0, 0, 0, 0],
 [1, 1, 0, 1],
 [0, 0, 1, 1]]
您的解决方案的问题在于您使用了:

new_matrix_list = [[0] * rows] * cols
这使得每个列表都是相同的对象。 有关问题,请参见此示例:

>>> x = [[0]*3] * 4
>>> x
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> x[0][0] = 1
>>> x
[[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0]]
使用类似于:

new_matrix_list = [[0 for _ in range(rows)] for _ in range(cols)]

您应该已经走上了正轨。

使用嵌套列表理解:

rows, cols = len(raw_matrix_list), len(raw_matrix_list[0])

>>> [[raw_matrix_list[i][j] for i in range(rows)] for j in range(cols)]
[[1, 1, 0, 1],
 [0, 0, 0, 0],
 [1, 0, 0, 0],
 [0, 0, 0, 0],
 [1, 1, 0, 1],
 [0, 0, 1, 1]]

使用嵌套列表理解:

rows, cols = len(raw_matrix_list), len(raw_matrix_list[0])

>>> [[raw_matrix_list[i][j] for i in range(rows)] for j in range(cols)]
[[1, 1, 0, 1],
 [0, 0, 0, 0],
 [1, 0, 0, 0],
 [0, 0, 0, 0],
 [1, 1, 0, 1],
 [0, 0, 1, 1]]

已经有一些答案可以帮助你解决问题。至于为什么你的代码不能工作,是不是应该是这样(根据矩阵转置的定义):


新矩阵列表[ii][jj]=原始矩阵列表[jj][ii]

已经有一些答案可以帮助您解决问题。至于为什么你的代码不能工作,是不是应该是这样(根据矩阵转置的定义):


new_matrix_list[ii][jj]=raw_matrix_list[jj][ii]

您能在这个示例中发布您希望得到的吗?更新如上,谢谢您发布您希望在这个示例中获得的内容吗?更新如上,谢谢您优雅的回答,我将其标记为已接受。但让我发疯的是为什么我的代码不起作用。谢谢你优雅的回答,我将它标记为已接受。但让我发疯的是为什么我的代码不起作用。你也能帮忙吗。