2016-02-24 106 views
2

短版 欲操纵numpy的阵列(试验,见第一代码片段),使之成为重排(evenodd_single_column,见第二代码段)。我写了一个for循环,但由于我正在处理半大数据,如果有更好的方法来实现这一点,我会很高兴。操纵numpy的阵列

龙版 我写一个脚本,在一个点上我应该做以下操作一个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]]) 

需要被转换成一个数组,取第一个X(时间点,在这个例子中2)从所有的列(实验,这里是3),并把它放在一个数组中。然后它转到所有列的下两个值并追加数组,直到所有迭代(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

回答做到了! 对于我编程水平上的人们的未来参考:) test.reshape(您分割数据的次数,通过列运行的次数除以2,从实例的每列取得的数据点的数量,总数初始栏的数量),休息保持不变。 (2,y/2,x,test.shape [1])。transpose(1,0,3,2).reshape(-1,2) – dtadres

+0

精彩的解释在那里,谢谢! :)我解释所有这些与自己有关的操作相关的问题的方式是3个步骤:拆分,对齐变暗使它们在线性索引时相邻,重塑为预期格式。 – Divakar

回答

2

您可以使用和np.reshape组合np.transpose -

test.reshape(2,2,2,3).transpose(1,0,3,2).reshape(-1,2) 

采样运行 - 从Divakar

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]]) 
+0

完美!为我解决了 - 谢谢。 – dtadres