我有一个包含许多行和8列的大型NumPy
数组(OriginalArray
)。
我想创建一个新数组(NewArray
),其中每一行都有以下属性:
NewArray
的第1,3,5和7列是sum
的第1,3,5和7列的N
行OriginalArray
行}
NewArray
的第2,4,6和8列是mean
第2,4,6和8列的N
个OriginalArray
行}
因此,NewArray
的行数1/N
与OriginalArray
一样多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
请原谅凌乱的格式。我现在还是很新(我的第一个问题,实际上)。
谢谢!
答案 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. ]])