Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.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 x,y对的转置平坦矩阵_Python_Matrix_Transpose - Fatal编程技术网

Python x,y对的转置平坦矩阵

Python x,y对的转置平坦矩阵,python,matrix,transpose,Python,Matrix,Transpose,我得到了一个代表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] ma

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

  • 我想知道这是否可能在一次通过 通过矩阵而不使用外部库,如 上面的例子
  • 我希望这对正方形和非正方形矩阵都有效
  • 虽然您要求提供“无库”解决方案,但我非常建议使用
    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
      将列表转换为
      数组
    • 然后将其
      重塑为
      3x3x2
      ,即元组的3x3矩阵
    • 然后对其进行转置,交换第一(0)和第二(1)个轴,并保持第三(2)个轴的位置
    • 最后用
      ravel
    如果最后不能使用numpy,您仍然可以使用它正确地转置索引矩阵,以确定哪个元素必须转置到哪里,然后在列表上通过循环
    重新生成该元素,以_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
    -解决方案更干净。

    如果您坚持不使用
    numpy
    ,我建议您先分离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]
    a = to_transpose
    
    rows = 3
    cols = 3
    tot = rows*cols
    
    # separated
    x, y = a[::2], a[1::2]
    xt = [x[i+j] for i in range(0, rows) for j in range(0, tot, cols)]
    yt = [y[i+j] for i in range(0, rows) for j in range(0, tot, cols)]
    transposed = [e for t in zip(xt, yt) for e in t]
    
    # tupled
    xy = [(i,j) for i,j in zip(a[::2], a[1::2])]
    xyt = [xy[i+j] for i in range(0, rows) for j in range(0, tot, cols)]
    transposed = [e for t in xyt for e in t]
    

    很明显,即使这样做有效,
    numpy
    对于此类操作来说将是一个更好的工具。

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

    #!/bin/python3
    
    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
    
    to_transpose_with_pairs = [(to_transpose[2 * i], to_transpose[2 * i + 1]) for i in range(len(to_transpose) // 2)]
    # [
    #     (0.914, 0.639), (0.058, 0.76), (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.52, 0.225)
    # ]
    
    to_transpose_as_matrix = [None for _ in range(matrix_height)]
    
    for row in range(matrix_height):
        start = row * matrix_width // 2
        end = start + matrix_width // 2
    
        to_transpose_as_matrix[row] = to_transpose_with_pairs[start:end]
    
    # [
    #     [(0.914, 0.639), (0.058, 0.76), (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.52, 0.225)]
    # ]
    
    transposed_as_matrix = list(map(list, zip(*to_transpose_as_matrix)))
    # [
    #     [(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)]
    # ]
    
    transposed_with_pairs = [pair for row in transposed_as_matrix for pair in row]
    # [
    #     (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)
    # ]
    
    
    transposed = [val for pair in transposed_with_pairs for val in pair]
    # [
    #     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
    # ]
    
    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)
    
    我做了三件事:

    • 使用步长值作为2,使w跳过奇数值
    • 添加了一个额外的行,其中奇数索引元素获得y的值
    • 最后,将h的值加倍,以便每个替换元素都得到一个 新价值

    你可以不用numpy,一行/一次计算,但这很糟糕:

    m=to_transpose # for easy writing only
    [ n for l in zip( *[[(m[i],m[i+1]) for i in range(k,k+6,2)] for k in range(0,len(m),6)] ) for t in l for n in t ]
    

    改用numpy。

    您要求“无外部库”,但
    numpy
    将非常适合:
    np.array(to_transpose).restrape((6,3)).T.ravel()
    鉴于每两个值都属于同一个值,它可能更像是
    restrape(3,3)
    (2,3,3)
    @mkrieger1同意,我一开始并没有看到两个值是成对的。@Dominicksarle如果您将列表预处理为
    [(0.914,0.639),(0.058,0.760),…]
    ,那么您的方法会起作用。尝试列出列表我会接受这个答案,因为它是正确和快速的。非常感谢。但是,您是否知道一种不使用numpy的方法(在for循环中)?