我有一个非常大的蒙面NumPy数组(originalArray)有很多行和两列.我想取每两行的平均值originalArray并构建一个newArray其中每行是两行的平均值originalArray(因此行newArray数的一半originalArray).这应该是一件简单的事情,但下面的脚本非常慢.非常感谢社区的任何建议.
newList = []
for i in range(0, originalArray.shape[0], 2):
r = originalArray[i:i+2,:].mean(axis=0)
newList.append(r)
newArray = np.asarray(newList)
Run Code Online (Sandbox Code Playgroud)
必须有一种更优雅的方式来做到这一点.非常感谢!
swe*_*zel 11
两个值的平均值a,并b为0.5*(a+b)
因此你可以做这样的:
newArray = 0.5*(originalArray[0::2] + originalArray[1::2])
Run Code Online (Sandbox Code Playgroud)
它将所有两个连续的行相加,最后将每个元素相乘0.5.
因为在标题中你要求平均N行,这里有一个更通用的解决方案:
def groupedAvg(myArray, N=2):
result = np.cumsum(myArray, 0)[N-1::N]/float(N)
result[1:] = result[1:] - result[:-1]
return result
Run Code Online (Sandbox Code Playgroud)
平均n元素的一般形式是sum([x1,x2,...,xn])/n.元素的总和m,以m+n在矢量v相同减去m-1从第i个元素m+n的第i个元素cumsum(v).除非m是0,否则你不会减去任何东西(结果[0]).
这就是我们在这里利用的.此外,因为一切都是线性的,所以在我们分开的地方并不重要N,所以我们在开始时就这么做,但这只是品味问题.
如果最后一个组的N元素少于元素,则将完全忽略它.如果你不想忽略它,你必须特别对待最后一组:
def avg(myArray, N=2):
cum = np.cumsum(myArray,0)
result = cum[N-1::N]/float(N)
result[1:] = result[1:] - result[:-1]
remainder = myArray.shape[0] % N
if remainder != 0:
if remainder < myArray.shape[0]:
lastAvg = (cum[-1]-cum[-1-remainder])/float(remainder)
else:
lastAvg = cum[-1]/float(remainder)
result = np.vstack([result, lastAvg])
return result
Run Code Online (Sandbox Code Playgroud)
您的问题(每两行两列的平均值):
>>> a = np.reshape(np.arange(12),(6,2))
>>> a
array([[ 0, 1],
[ 2, 3],
[ 4, 5],
[ 6, 7],
[ 8, 9],
[10, 11]])
>>> a.transpose().reshape(-1,2).mean(1).reshape(2,-1).transpose()
array([[ 1., 2.],
[ 5., 6.],
[ 9., 10.]])
Run Code Online (Sandbox Code Playgroud)
其他尺寸(每四行三列的平均值):
>>> a = np.reshape(np.arange(24),(8,3))
>>> a
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]])
>>> a.transpose().reshape(-1,4).mean(1).reshape(3,-1).transpose()
array([[ 4.5, 5.5, 6.5],
[ 16.5, 17.5, 18.5]])
Run Code Online (Sandbox Code Playgroud)
对于具有c列的二维数组a ,取r行平均值的一般公式:
a.transpose().reshape(-1,r).mean(1).reshape(c,-1).transpose()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5620 次 |
| 最近记录: |