Python NumPy:对每N行执行不同的列操作

时间:2016-10-25 16:16:56

标签: python arrays numpy

我有一个包含许多行和8列的大型NumPy数组(OriginalArray)。

我想创建一个新数组(NewArray),其中每一行都有以下属性:

  • NewArray的第1,3,5和7列是sum的第1,3,5和7列的NOriginalArray行}

  • NewArray的第2,4,6和8列是mean第2,4,6和8列的NOriginalArray行}

因此,NewArray的行数1/NOriginalArray一样多Original Array = [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ]

例如:

N = 2

NewArray = [2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1]

#!/usr/bin/env python

请原谅凌乱的格式。我现在还是很新(我的第一个问题,实际上)。

谢谢!

2 个答案:

答案 0 :(得分:0)

我假设您的original_array(注意PEP8样式)已经按行和列格式化了。我的意思是,original_array = np.array([[1,1...],[1,...],[1,...],[1,...]])

创建单行new_array的简单单行内容如下:

import numpy as np
row = [np.sum(original_array[:,x]) if x%2==1 else np.mean(test[:,x]) for x in range(len(original_array[0]))]

然后复制该行,只需:

new_array = [row]*N

答案 1 :(得分:0)

这是一种大量使用slicing -

的矢量化方法
nrows = a.shape[0]//N  # a is input array
out = np.empty((nrows,8))
out[:,::2] = a[:,::2].reshape(-1,N,4).sum(1)
out[:,1::2] = a[:,1::2].reshape(-1,N,4).mean(1)

示例运行 -

In [64]: a     # Input array
Out[64]: 
array([[5, 1, 5, 8, 5, 0, 3, 1],
       [0, 7, 8, 7, 0, 3, 5, 1],
       [8, 6, 6, 4, 1, 6, 1, 2],
       [4, 5, 5, 7, 5, 2, 1, 2]])

In [65]: N = 2 # Summing/averaging length

In [66]: a[:,::2] # Select [1,3,5,7] cols
Out[66]: 
array([[5, 5, 5, 3],
       [0, 8, 0, 5],
       [8, 6, 1, 1],
       [4, 5, 5, 1]])

In [67]: a[:,::2].reshape(-1,N,4).sum(1) # Sum N rows by splitting axis
Out[67]: 
array([[ 5, 13,  5,  8],
       [12, 11,  6,  2]])

In [68]: a[:,1::2] # Select [2,4,6,8] cols
Out[68]: 
array([[1, 8, 0, 1],
       [7, 7, 3, 1],
       [6, 4, 6, 2],
       [5, 7, 2, 2]])

In [69]: a[:,1::2].reshape(-1,N,4).mean(1) # Similarly average across N rows
Out[69]: 
array([[ 4. ,  7.5,  1.5,  1. ],
       [ 5.5,  5.5,  4. ,  2. ]])