猿问

转置 x,y 对的扁平矩阵

我得到了一个代表 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 = 6

matrix_height = 3

# INITIALIZE AN EMPTY LIST

transposed_list = [None] * matrix_width * matrix_height


for 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。


我想知道这是否可以在不使用外部库的情况下通过矩阵一次,如上例所示?

我希望它适用于方阵和非方阵。


一只萌萌小番薯
浏览 202回答 3
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 = 6matrix_height = 3# INITIALIZE AN EMPTY LISTtransposed_list = [None] * matrix_width * matrix_heightfor 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 的值加倍,以便每个替代元素都获得一个新值

忽然笑

当您要求“无库”解决方案时,我非常建议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 更干净。
随时随地看视频慕课网APP

相关分类

Python
我要回答