为了账号安全,请及时绑定邮箱和手机立即绑定

转置 x,y 对的扁平矩阵

转置 x,y 对的扁平矩阵

一只萌萌小番薯 2021-09-11 10:10:34
我得到了一个代表 x 和 y 值的十进制数的一维数组。我需要转置给定的一维数组,就好像它是一个矩阵一样。我当前的代码是这样做的,但不完全是我想要的:to_transpose = [0.914, 0.639, 0.058, 0.760, 0.926, 0.475,                0.255, 0.671, 0.195, 0.966, 0.336, 0.841,                0.279, 0.341, 0.591, 0.638, 0.520, 0.225]matrix_width = 6matrix_height = 3# INITIALIZE AN EMPTY LISTtransposed_list = [None] * matrix_width * matrix_heightfor w in range(matrix_width):    for h in range(matrix_height):        transposed_list[w * matrix_height + h] = to_transpose[h * matrix_width + w]这段代码正确地转置了矩阵,但不是我想要的格式。由于这是一个 x、y 值的数组,所需的输出如下所示:correct_output=[0.914, 0.639, 0.255, 0.671, 0.279, 0.341,                0.058, 0.760, 0.195, 0.966, 0.591, 0.638,                0.926, 0.475, 0.336, 0.841, 0.520, 0.225]在正确的输出中,每 2 位小数在转置中被视为 1。我想知道这是否可以在不使用外部库的情况下通过矩阵一次,如上例所示?我希望它适用于方阵和非方阵。
查看完整描述

3 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

我发现这可以按照您希望的方式工作,只需通过矩阵一次,无需使用任何库。


to_transpose = [0.914, 0.639, 0.058, 0.760, 0.926, 0.475,

                0.255, 0.671, 0.195, 0.966, 0.336, 0.841,

                0.279, 0.341, 0.591, 0.638, 0.520, 0.225]

matrix_width = 6

matrix_height = 3

# INITIALIZE AN EMPTY LIST

transposed_list = [None] * matrix_width * matrix_height


for w in range(0, matrix_width, 2):

    for h in range(matrix_height):

        transposed_list[w * matrix_height + (2 * h)] = to_transpose[h * matrix_width + w]

        transposed_list[(w * matrix_height + (2 * h)) + 1] = to_transpose[(h * matrix_width + w) + 1]

print(transposed_list)

我做了3件事:


通过使用步长值为 2 使 w 跳过奇数

添加了额外的一行,其中奇数索引元素获取 y 的值

最后将 h 的值加倍,以便每个替代元素都获得一个新值


查看完整回答
反对 回复 2021-09-11
?
忽然笑

TA贡献1806条经验 获得超5个赞

当您要求“无库”解决方案时,我非常建议numpy用于与矩阵操作相关的所有内容,例如整形或转置,您在这里都需要:


>>> import numpy as np

>>> to_transpose = [0.914, 0.639, 0.058, 0.760, 0.926, 0.475,

                    0.255, 0.671, 0.195, 0.966, 0.336, 0.841,

                    0.279, 0.341, 0.591, 0.638, 0.520, 0.225]


>>> np.array(to_transpose).reshape((3,3,2)).transpose(1,0,2).ravel()

array([ 0.914,  0.639,  0.255,  0.671,  0.279,  0.341,

        0.058,  0.76 ,  0.195,  0.966,  0.591,  0.638,

        0.926,  0.475,  0.336,  0.841,  0.52 ,  0.225])

稍微分解一下:


np.array将您的清单变成array...

然后你reshape去3x3x2,即一个 3x3 的元组矩阵......

然后transpose,您交换第一个 (0) 和第二个 (1) 轴并保持第三个 (2) 到位...

最后矩阵再次变平 ravel

如果您最终不能使用 numpy,您仍然可以使用它来正确转置索引矩阵以确定哪个元素必须去哪里,然后通过列表循环重现它to_transpose:


>>> list(np.array(list(range(w*h))).reshape((3,3,2)).transpose(1,0,2).ravel())

[0, 1, 6, 7, 12, 13, 2, 3, 8, 9, 14, 15, 4, 5, 10, 11, 16, 17]


>>> [i%2 + (i//2 * w % (w*h)) + 2 * (i//(h*2)) for i in range(w*h)]

[0, 1, 6, 7, 12, 13, 2, 3, 8, 9, 14, 15, 4, 5, 10, 11, 16, 17]


>>> [to_transpose[i%2 + (i//2 * w % (w*h)) + 2 * (i//(h*2))] for i in range(w*h)]

[0.914, 0.639, 0.255, 0.671, 0.279, 0.341,

 0.058, 0.76, 0.195, 0.966, 0.591, 0.638,

 0.926, 0.475, 0.336, 0.841, 0.52, 0.225]

当然,你也可以用常规循环代替列表推导式和其他语言来做同样的事情。基本上,添加索引的三个术语中的每一个都对应于矩阵的一个维度,老实说,我通过猜测而不是真正理解正在发生的事情来解决这个问题。不用说,numpy-solution 更干净。


查看完整回答
反对 回复 2021-09-11
  • 3 回答
  • 0 关注
  • 201 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信