首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重排数组[1,2,3,4,5,6]至[1,3,5,2,4,6]

重排数组[1,2,3,4,5,6]至[1,3,5,2,4,6]
EN

Stack Overflow用户
提问于 2015-10-01 12:43:28
回答 3查看 522关注 0票数 0

我在寻找皇家之路来重新排列一个可变长度的数组

代码语言:javascript
复制
[1, 2, 3, 4, 5, 6]

变成这样的东西:

代码语言:javascript
复制
[1, 3, 5, 2, 4, 6]

数组的长度总是可以被3整除的。所以我也可以有这样的数组:

代码语言:javascript
复制
[1, 2, 3, 4, 5, 6, 7, 8, 9]

应转化为:

代码语言:javascript
复制
[1, 4, 7, 2, 5, 8, 3, 6, 9]

一个真正的例子应该是这样的:

代码语言:javascript
复制
['X.1', 'X.2', 'Y.1', 'Y.2', 'Z.1', 'Z.2']

我想将其转化为:

代码语言:javascript
复制
['X.1', 'Y.1', 'Z.1', 'X.2', 'Y.2', 'Z.2']

大小为3的数组或空数组应保持不变。

我该怎么做?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-10-01 12:47:38

如果a是NumPy数组的名称,则可以编写:

代码语言:javascript
复制
a.reshape(3, -1).ravel('f')

(这假设数组可以被3整除,正如您已经说过的那样。)

该方法的工作方式是首先将每个len(a) / 3元素块视为2D数组的行,然后按列展开该2D数组。

例如:

代码语言:javascript
复制
>>> 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])
票数 3
EN

Stack Overflow用户

发布于 2015-10-01 12:48:14

没有无规律的解决方案:

代码语言:javascript
复制
>>> 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)来理解:

代码语言:javascript
复制
>>> 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的任何其他方法。

票数 2
EN

Stack Overflow用户

发布于 2015-10-01 12:48:03

使用整形和转置(或T)就可以了:

代码语言:javascript
复制
import numpy as np
t = np.arange(1, 10)
t2 = np.reshape(t, [t.shape[0]/3, 3]).T.reshape(len(t))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32887918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档