首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数字化numpy阵列

数字化numpy阵列
EN

Stack Overflow用户
提问于 2015-08-05 22:48:59
回答 3查看 703关注 0票数 3

我有两个向量:

代码语言:javascript
复制
  time_vec = np.array([0.2,0.23,0.3,0.4,0.5,...., 28....])
  values_vec = np.array([500,200,220,250,200,...., 218....])
  time_vec.shape == values_vec.shape 

现在,我想取每0.5秒间隔的值,并取值的平均值。所以,例如

代码语言:javascript
复制
  value_vec = np.array(mean_of(500,200,220,250,200), mean_of(next values in next 0.5 second interval))

有没有什么方法,我错过了哪个垃圾桶,拿平均的回收箱?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-08-05 23:07:00

您可以使用np.ufunc.reduceat。您只需要填充断点所在的位置,即当floor(t / .5)更改时:

说代表:

代码语言:javascript
复制
>>> t
array([ 0.    ,  0.025 ,  0.2125,  0.2375,  0.2625,  0.3375,  0.475 ,  0.6875,  0.7   ,  0.7375,  0.8   ,  0.9   ,
        0.925 ,  1.05  ,  1.1375,  1.15  ,  1.1625,  1.1875,  1.1875,  1.225 ])
>>> b
array([ 0.8144,  0.3734,  1.4734,  0.6307, -0.611 , -0.8762,  1.6064,  0.3863, -0.0103, -1.6889, -0.4328, -0.7373,
        1.7856,  0.8938, -1.1574, -0.4029, -0.4352, -0.4412, -1.7819, -0.3298])

断点是:

代码语言:javascript
复制
>>> i = np.r_[0, 1 + np.nonzero(np.diff(np.floor(t / .5)))[0]]
>>> i
array([ 0,  7, 13])

每个间隔的总和是:

代码语言:javascript
复制
>>> np.add.reduceat(b, i)
array([ 3.411 , -0.6975, -3.6545])

平均值是间隔长度之和:

代码语言:javascript
复制
>>> np.add.reduceat(b, i) / np.diff(np.r_[i, len(b)])
array([ 0.4873, -0.1162, -0.5221])
票数 3
EN

Stack Overflow用户

发布于 2015-08-05 23:04:07

您可以将一个weights=参数传递给np.histogram,以计算每次bin内的求和值,然后通过bin计数进行规范化:

代码语言:javascript
复制
# 0.5 second time bins to average within
tmin = time_vec.min()
tmax = time_vec.max()
bins = np.arange(tmin - (tmin % 0.5), tmax - (tmax % 0.5) + 0.5,  0.5)

# summed values within each bin
bin_sums, edges = np.histogram(time_vec,bins=bins, weights=values_vec)

# number of values within each bin
bin_counts, edges = np.histogram(time_vec,bins=bins)

# average value within each bin
bin_means = bin_sums / bin_counts
票数 2
EN

Stack Overflow用户

发布于 2015-08-06 06:15:49

您可以使用被认为是非常有效的np.bincount来执行这样的二进制操作。这里有一个基于它的实现来解决我们的案子-

代码语言:javascript
复制
# Find indices where 0.5 intervals shifts onto next ones
A = time_vec*2
idx = np.searchsorted(A,np.arange(1,int(np.ceil(A.max()))),'right')

# Setup ID array such that all 0.5 intervals are ID-ed same
out = np.zeros((A.size),dtype=int)
out[idx[idx < A.size]] = 1
ID = out.cumsum()

# Finally use bincount to sum and count elements of same IDs
# and thus get mean values per ID
mean_vec = np.bincount(ID,values_vec)/np.bincount(ID)

样本运行-

代码语言:javascript
复制
In [189]: time_vec
Out[189]: 
array([ 0.2 ,  0.23,  0.3 ,  0.4 ,  0.5 ,  0.7 ,  0.8 ,  0.92,  0.95,
        1.  ,  1.11,  1.5 ,  2.  ,  2.3 ,  2.5 ,  4.5 ])

In [190]: values_vec
Out[190]: array([36, 11, 93, 32, 72, 75, 26, 28, 77, 31, 60, 77, 76, 32,  6, 85])

In [191]: ID
Out[191]: array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 3, 4, 4, 5], dtype=int32)

In [192]: mean_vec
Out[192]: array([ 48.8,  47.4,  68.5,  76. ,  19. ,  85. ])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31844094

复制
相关文章

相似问题

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