【问题标题】:Convert the input into a matrix when the inputs are the diagonal elements当输入是对角元素时将输入转换为矩阵
【发布时间】:2020-04-14 07:35:22
【问题描述】:

我有一个清单如下:

[[1],[2,1],[3,2,1],[3,1,2],[1,2],[1]]

以上是输入。

这些是原始列表的对角线元素:

[[3,3,1,1],[2,2,1,2],[1,1,1,2]]

也就是说,

3 3 1 1
2 2 1 2
1 1 1 2

所以问题是从对角元素的输入中重建原始列表。

如您所见,对角线元素遵循主对角线的方向。对于任意维度的矩阵,如何实现这一点?

【问题讨论】:

  • 这能回答你的问题吗? Shear a numpy array
  • 您需要先对列表进行零填充,然后创建一个矩阵,并从建议的副本中应用一种剪切方法。
  • 我会看到它@norok2。谢谢。

标签: python-3.x matrix


【解决方案1】:

您可以通过以下步骤做到这一点:

  • 从输入中填充一个零背景矩阵(以便剪切感兴趣的值)
  • 应用剪切(甚至是换位),以使所有零点最终出现在边缘的某些行/列中
  • 切掉背景零

这可以使用 NumPy 数组或普通 Python lists 来完成。

使用 NumPy

import numpy as np


l = [[1],[2,1],[3,2,1],[3,1,2],[1,2],[1]]
m = np.array([[3,3,1,1],[2,2,1,2],[1,1,1,2]])

rows = max(len(x) for x in l)
cols = len(l) - rows + 1

# fill a shear matrix from the input
a = np.zeros((rows, len(l)), dtype=m.dtype)
for j, x in enumerate(l):
    k = rows - j - 1
    a[:, j] = [0] * k + x + [0] * (-k - 1)
print(a)
# [[0 0 3 3 1 1]
#  [0 2 2 1 2 0]
#  [1 1 1 2 0 0]]

# apply the shearing
for i in range(rows):
    a[i, :] = np.roll(a[i, :], i)
print(a)
# [[0 0 3 3 1 1]
#  [0 0 2 2 1 2]
#  [0 0 1 1 1 2]]

# slice out the zeros
a = a[:, len(l) - cols:]
print(a)
# [[3 3 1 1]
#  [2 2 1 2]
#  [1 1 1 2]]

np.all(a == m)
# True

与lists

def transpose(seq):
    return type(seq)(map(type(seq), zip(*seq)))


def rotate(seq, i):
    return seq[-i:] + seq[:-i]


def shear(seq):
    return type(seq)(rotate(x, i) for i, x in enumerate(seq))


l = [[1],[2,1],[3,2,1],[3,1,2],[1,2],[1]]
m = [[3,3,1,1],[2,2,1,2],[1,1,1,2]]

rows = max(len(x) for x in l)
cols = len(l) - rows + 1

# fill zero-background matrix from the input
a = [([0] * (rows - j - 1) + x + [0] * (j - rows)) for j, x in enumerate(l)]
print(a)
# [[0, 0, 1], [0, 2, 1], [3, 2, 1], [3, 1, 2], [1, 2, 0], [1, 0, 0]]

# apply the transposition and the shearing
print(transpose(a))
# [[0, 0, 3, 3, 1, 1], [0, 2, 2, 1, 2, 0], [1, 1, 1, 2, 0, 0]]
print(shear(transpose(a)))
# [[0, 0, 3, 3, 1, 1], [0, 0, 2, 2, 1, 2], [0, 0, 1, 1, 1, 2]]

# slice out the zeros
a = [x[len(a) - cols:] for x in shear(transpose(a))]
print(a)
# [[3, 3, 1, 1], [2, 2, 1, 2], [1, 1, 1, 2]]
print(a == m)
# True

或者,为了更简洁,不分离逻辑操作:

l = [[1],[2,1],[3,2,1],[3,1,2],[1,2],[1]]
m = [[3,3,1,1],[2,2,1,2],[1,1,1,2]]

rows = max(len(x) for x in l)
cols = len(l) - rows + 1

a = [([0] * (rows - j - 1) + x + [0] * (j - rows)) for j, x in enumerate(l)]
a = [list(x[len(a) - cols - i:len(a) - i]) for i, x in enumerate(zip(*a))]
print(a)
# [[3, 3, 1, 1], [2, 2, 1, 2], [1, 1, 1, 2]]
print(a == m)
# True

【讨论】:

  • 非常感谢@norok2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-22
  • 1970-01-01
  • 1970-01-01
  • 2011-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多