【问题标题】:Manipulating numpy arrays操作 numpy 数组
【发布时间】:2016-06-06 12:35:39
【问题描述】:

短版 我想操作一个 numpy 数组(测试,参见第一个代码 sn-p),使其重新排列(evenodd_single_column,参见第二个代码 sn-p)。我写了一个 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 数组。

我不是受过培训的程序员,如果解决方案很明显,我提前道歉!

谢谢!

【问题讨论】:

  • Divakar 的回答做到了!供我编程水平的人将来参考:) test.reshape(拆分数据的次数,通过列运行的次数除以 2,在实例中从每列获取的数据点数,总数初始列),其余部分保持不变。或者如最初的例子:test.reshape(2,y/2,x,test.shape[1]).transpose(1,0,3,2).reshape(-1,2)
  • 那里有精彩的解释,谢谢! :) 对于此类与操作相关的问题,我向自己解释所有这些的方式是 3 个步骤:拆分、对齐暗淡以使它们在线性索引时相邻,重塑为预期的格式。

标签: python arrays performance numpy vectorization


【解决方案1】:

您可以使用np.reshapenp.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]])

【讨论】:

    猜你喜欢
    • 2018-11-30
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多