Python 简单矩阵类型旋转(无numpy或pandas)
这一定很简单,但我无法解决 我想使用本机python列表进行矩阵类型的转置(即,不使用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
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]
您能在这个示例中发布您希望得到的吗?更新如上,谢谢您发布您希望在这个示例中获得的内容吗?更新如上,谢谢您优雅的回答,我将其标记为已接受。但让我发疯的是为什么我的代码不起作用。谢谢你优雅的回答,我将它标记为已接受。但让我发疯的是为什么我的代码不起作用。你也能帮忙吗。