首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NumPy数组中N行的求和块

NumPy数组中N行的求和块
EN

Stack Overflow用户
提问于 2017-11-22 06:31:54
回答 2查看 2.8K关注 0票数 0

这可能是一个重复的问题,但我找不到确切的解决方案,我需要。

我试图将每N行(例如本例中的4行)相加在一起。因此,在8×9矩阵中,我将得到一个2×9的数组,即将行0-3相加,然后将4-7行相加。现在,这是我的解决方案,但有没有办法不使用列表理解?有没有更多的“矮胖”的方法来做这件事?因为我最终得到的是一个由21-9数组组成的列表,而不是一个2x9数组。

输入数组不是固定在8乘9,可以是12乘9,也可以是28乘9,但是输入数组的总行数总是N的整数倍(在本例中为8,N=4)。

代码语言:javascript
复制
>>> import numpy as np
>>> a = np.arange(72).reshape(8,9)
>>> 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, 24, 25, 26],
   [27, 28, 29, 30, 31, 32, 33, 34, 35],
   [36, 37, 38, 39, 40, 41, 42, 43, 44],
   [45, 46, 47, 48, 49, 50, 51, 52, 53],
   [54, 55, 56, 57, 58, 59, 60, 61, 62],
   [63, 64, 65, 66, 67, 68, 69, 70, 71]])

>>> b = [a[i:(i+1)*4,:] for i in range(0,len(a),4)]

>>> b
   [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, 24, 25, 26],
   [27, 28, 29, 30, 31, 32, 33, 34, 35]]), 
   array([[36, 37, 38, 39, 40, 41, 42, 43, 44],
   [45, 46, 47, 48, 49, 50, 51, 52, 53],
   [54, 55, 56, 57, 58, 59, 60, 61, 62],
   [63, 64, 65, 66, 67, 68, 69, 70, 71]])]

>>> b = [np.sum(a[i:(i+1)*4,:],axis=0) for i in range(0,len(a),4)]

>>> b

>>>[array([54, 58, 62, 66, 70, 74, 78, 82, 86]), array([198, 202, 206, 210, 
   214, 218, 222, 226, 230])]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-22 06:34:48

将第一个轴拆分为两个,使后一个轴的长度等于窗口长度= 4,给我们一个3D数组,然后沿着那个数组进行和,就像这样-

代码语言:javascript
复制
a.reshape(-1,4,a.shape[-1]).sum(1)

它工作在泛型数组上,在整形方法中使用该-1,因为它计算拆分/整形版本的第一个轴的长度,从而为我们提供了一个通用解决方案。

为了让事情变得更清楚-

代码语言:javascript
复制
# Input array with 8 rows
In [15]: a = np.arange(72).reshape(8,9)

# Get output shape
In [16]: a.reshape(-1,4,a.shape[-1]).sum(1).shape
Out[16]: (2, 9)

# Input array with 28 rows
In [17]: a = np.arange(28*9).reshape(28,9)

# Get output shape
In [18]: a.reshape(-1,4,a.shape[-1]).sum(1).shape
Out[18]: (7, 9)
票数 3
EN

Stack Overflow用户

发布于 2017-11-22 06:36:32

代码语言:javascript
复制
In [120]: a
Out[120]:
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, 24, 25, 26],
       [27, 28, 29, 30, 31, 32, 33, 34, 35],
       [36, 37, 38, 39, 40, 41, 42, 43, 44],
       [45, 46, 47, 48, 49, 50, 51, 52, 53],
       [54, 55, 56, 57, 58, 59, 60, 61, 62],
       [63, 64, 65, 66, 67, 68, 69, 70, 71]])

In [121]: a.reshape((2, 4, 9)).sum(axis=1)
Out[121]:
array([[ 54,  58,  62,  66,  70,  74,  78,  82,  86],
       [198, 202, 206, 210, 214, 218, 222, 226, 230]])
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47428193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档