简短版 我想操作一个numpy数组(测试,请参阅第一个代码片段),以便重新排列(evenodd_single_column,请参阅第二个代码段)。我写了一个for循环,但由于我正在使用半大数据,如果有更好的方法可以实现这一点,我会很高兴。
长版 我正在编写一个脚本,在某一点上我应该在numpy数组上进行以下操作:
test = np.arange(24).reshape(8,3)
test
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17],
[18, 19, 20],
[21, 22, 23]])
需要将转换为一个数组,该数组从所有列(实验,此处为3)获取前x(时间点,在此示例中为2),并将其放入数组中。然后它转到所有列的下两个值并附加数组,直到所有迭代(y)结束。最后看起来应该是这样的:
>>> evenodd_single_column
array([[ 0, 3],
[ 1, 4],
[ 2, 5],
[12, 15],
[13, 16],
[14, 17],
[ 6, 9],
[ 7, 10],
[ 8, 11],
[18, 21],
[19, 22],
[20, 23]])
为了达到这个目的,我不得不写一个for循环:
all_odd = []
all_even = []
x = 2
y = 4
test = np.arange(24).reshape(8,3)
counter = 0
for i in range(1, int(test.shape[0]/2)+1):
time_window = i * x
if math.modf(counter / 2)[0] == 0:
for j in range(0, test.shape[1]):
all_even.extend(test[time_window - x:time_window, j])
else:
for j in range(0,test.shape[1]):
all_odd.extend(test[time_window - x:time_window, j])
counter = counter + 1
even_single_column_test = np.asarray(all_even).reshape((int(y / 2 * test.shape[1]), x))
odd_single_column_test = np.asarray(all_odd).reshape((int(y / 2 * test.shape[1]), x))
evenodd_single_column = even_single_column_test
evenodd_single_column = np.append(evenodd_single_column, odd_single_column_test).reshape(int(odd_single_column_test.shape[0]*2), x)
我的问题:这可以通过一个优雅(更重要的是 - 更快)的numpy矩阵操作来完成吗?我不想绕过循环,制作列表然后再将它们转换为numpy数组。
我不是训练有素的程序员,如果解决方案显而易见,我会事先道歉!
谢谢!
答案 0 :(得分:3)
您可以使用np.reshape
和np.transpose
-
test.reshape(2,2,2,3).transpose(1,0,3,2).reshape(-1,2)
示例运行 -
In [42]: test
Out[42]:
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17],
[18, 19, 20],
[21, 22, 23]])
In [43]: test.reshape(2,2,2,3).transpose(1,0,3,2).reshape(-1,2)
Out[43]:
array([[ 0, 3],
[ 1, 4],
[ 2, 5],
[12, 15],
[13, 16],
[14, 17],
[ 6, 9],
[ 7, 10],
[ 8, 11],
[18, 21],
[19, 22],
[20, 23]])