我在寻找皇家之路来重新排列一个可变长度的数组
[1, 2, 3, 4, 5, 6]变成这样的东西:
[1, 3, 5, 2, 4, 6]数组的长度总是可以被3整除的。所以我也可以有这样的数组:
[1, 2, 3, 4, 5, 6, 7, 8, 9]应转化为:
[1, 4, 7, 2, 5, 8, 3, 6, 9]一个真正的例子应该是这样的:
['X.1', 'X.2', 'Y.1', 'Y.2', 'Z.1', 'Z.2']我想将其转化为:
['X.1', 'Y.1', 'Z.1', 'X.2', 'Y.2', 'Z.2']大小为3的数组或空数组应保持不变。
我该怎么做?
发布于 2015-10-01 12:47:38
如果a是NumPy数组的名称,则可以编写:
a.reshape(3, -1).ravel('f')(这假设数组可以被3整除,正如您已经说过的那样。)
该方法的工作方式是首先将每个len(a) / 3元素块视为2D数组的行,然后按列展开该2D数组。
例如:
>>> a = np.array([1, 2, 3, 4, 5, 6])
>>> a.reshape(3, -1).ravel('f')
array([1, 3, 5, 2, 4, 6])
>>> b = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> b.reshape(3, -1).ravel('f')
array([1, 4, 7, 2, 5, 8, 3, 6, 9])发布于 2015-10-01 12:48:14
没有无规律的解决方案:
>>> r = range(1,10)
>>> sum([r[i::len(r)/3] for i in range(len(r)/3)],[])
[1, 4, 7, 2, 5, 8, 3, 6, 9]我使用sum连接列表,因为它是最自我包含和可读性最强的示例。但正如评论中所提到的,它肯定不是最有效的。为了提高效率,您可以使用列表(In)来理解:
>>> r = range(1,10)
>>> [x for y in [r[i::len(r)/3] for i in range(len(r)/3)] for x in y]
[1, 4, 7, 2, 5, 8, 3, 6, 9]或者提到here的任何其他方法。
发布于 2015-10-01 12:48:03
使用整形和转置(或T)就可以了:
import numpy as np
t = np.arange(1, 10)
t2 = np.reshape(t, [t.shape[0]/3, 3]).T.reshape(len(t))https://stackoverflow.com/questions/32887918
复制相似问题