旋转从一维数组构建的矩阵

时间:2018-07-11 18:01:28

标签: python matrix

您好,我有一个排序列表['a','b','c','d','e','f'],当前以矩阵的形式显示在前端

['a','c','e'], ['b,'d','f'], 何时应该

['a','b','c'], ['d,'e','f'],

不幸的是,我无法修改前端以水平显示对象,因此我希望能够以正确的顺序['a','d','b','e','c',f']将1d数组重新排列为另一个1d数组。

从概念上讲,我知道如何将1d数组转换为2d数组,然后旋转矩阵,然后将2d数组转换回1d数组。但是,我想知道是否有更pythonic的方式/更快的通用算法来实现这一目标。

2 个答案:

答案 0 :(得分:2)

通过切片来跨越它

for x, a, b, c, y in dataB:
    tree = dictA.get((a, b, c))
    if tree:
        d, e, fs = tree.search(y)
        if f:
            for f in fs:
                yield x, f

如果需要将其推广到任意维度,请考虑使用numpy:

>>> L = ['a','b','c','d','e','f']
>>> [*L[0::3], *L[1::3], *L[2::3]]
['a', 'd', 'b', 'e', 'c', 'f']

答案 1 :(得分:1)

使用numpy

考虑到您正在谈论的是GUI,并且GUI倾向于更改大小,我认为最有效的方法是使用numpy来实施您自己的建议:

a = np.array(['a','b','c','d','e','f'])
n = len(a)
a.reshape(2, int(n)/2).T.reshape(1,n)

输出为:

array([['a', 'd', 'b', 'e', 'c', 'f']], dtype='<U1')

速度比较

使用切片

使用答案wim中的解决方案:

%timeit [*L[0::3], *L[1::3], *L[2::3]]
>>> 559 ns ± 18 ns per loop

使用Numpy,可前后转换

%timeit np.array(L).reshape(2,3).T.reshape(1,6).tolist()
>>> 5.01 µs ± 257 ns per loop

使用Numpy,无需进行转换

a = np.array(L)
%timeit L.reshape(2,3).T.reshape(1,6)
>>> 1.58 µs ± 84.1 ns per loop

使用列表理解切片

n = int(len(L)/2)
%timeit [j for i in range(n) for j in L[i::n]]
>>> 1.31 µs ± 73.3 ns 

结论

对于恒定大小,似乎wim最好是切片,然后在事先不知道大小的情况下用列表理解切片。