是否有一个scipy函数或numpy函数或模块用于python,在给定特定窗口的情况下计算一维数组的运行平均值?
我需要一个可在序列/迭代器/生成器上迭代的滚动窗口(也称为滑动窗口).默认的Python迭代可以被认为是一种特殊情况,窗口长度为1.我目前正在使用以下代码.有没有人有更多的Pythonic,更简洁,或更有效的方法来做到这一点?
def rolling_window(seq, window_size):
it = iter(seq)
win = [it.next() for cnt in xrange(window_size)] # First window
yield win
for e in it: # Subsequent windows
win[:-1] = win[1:]
win[-1] = e
yield win
if __name__=="__main__":
for w in rolling_window(xrange(6), 3):
print w
"""Example output:
[0, 1, 2]
[1, 2, 3]
[2, 3, 4]
[3, 4, 5]
"""
Run Code Online (Sandbox Code Playgroud) 我最近在这篇文章的答案中学到了大步,并且想知道如何使用它们来比我在本文中提出的更有效地计算移动平均滤波器(使用卷积滤波器).
这就是我到目前为止所拥有的.它接受原始数组的视图然后将其滚动必要的量并将内核值相加以计算平均值.我知道边缘没有正确处理,但我可以在以后处理...有更好更快的方法吗?目标是过滤大到5000x5000 x 16层的大型浮点阵列,这个任务scipy.ndimage.filters.convolve相当慢.
请注意,我正在寻找8邻居连接,即3x3滤镜取9个像素的平均值(焦点像素周围8个),并将该值分配给新图像中的像素.
import numpy, scipy
filtsize = 3
a = numpy.arange(100).reshape((10,10))
b = numpy.lib.stride_tricks.as_strided(a, shape=(a.size,filtsize), strides=(a.itemsize, a.itemsize))
for i in range(0, filtsize-1):
if i > 0:
b += numpy.roll(b, -(pow(filtsize,2)+1)*i, 0)
filtered = (numpy.sum(b, 1) / pow(filtsize,2)).reshape((a.shape[0],a.shape[1]))
scipy.misc.imsave("average.jpg", filtered)
Run Code Online (Sandbox Code Playgroud)
编辑关于我如何看待这个工作的澄清:
当前代码:
我希望的是更好地使用stride_tricks直接获取9个值或内核元素的总和,对于整个数组,或者有人可以说服我另一个更有效的方法......
我正在尝试在序列中扩展匹配匹配算法.我的比赛长20个单位,每个时间点有4个频道.我已经构建了一个封装匹配的模型,我无法弄清楚如何在滑动窗口中使用它来跨更长的序列应用它来查找序列中的匹配.
我有2个(20, 4)输入张量(query和target),我连接,添加,展平,然后应用一个简单的密集层.我在这个阶段有数据来训练100K查询,目标对.
def sum_seqs(seqs):
return K.sum(seqs, axis=3)
def pad_dims(seq):
return K.expand_dims(seq, axis=3)
def pad_outshape(in_shape):
return (in_shape[0], in_shape[1], in_shape[2], 1)
query = Input((20, 4))
query_pad = Lambda(pad_dims, output_shape=pad_outshape, name='gpad')(query)
target = Input((20,4))
target_pad = Lambda(pad_dims, output_shape=pad_outshape)(target)
matching = Concatenate(axis = 3)([query_pad, target_pad])
matching = Lambda(sum_seqs)(matching)
matching = Flatten()(matching)
matching = Dropout(0.1)(matching)
matching = Dense(1, activation = 'sigmoid')(matching)
match_model = Model([query, target], matching)
Run Code Online (Sandbox Code Playgroud)
这非常有效.现在我想使用这个预先训练的模型来搜索target具有不同query序列的更长序列.
它似乎应该是这样的:
long_target = Input((100, 4))
short_target = …Run Code Online (Sandbox Code Playgroud) 我试图将numpy.array长度为 40 的numpy.arrays拆分为较小的、大小相等的s,其中较小数组的数量由用户给出。允许在较小的阵列之间有一些重叠,因为在给定较小阵列的某种形式的重叠的情况下,可能发生全长只能被分裂整除的情况。
如果我有一个数组np.array([range(40)])
并且必须将其拆分为 37 个子数组,则子数组列表应该是这样的:
[1, 2, 3], [3, 4, 5], [5, 6, 7], ... [38, 39, 40]
Run Code Online (Sandbox Code Playgroud)
我尝试使用,numpy.split但这仅在长度可被尺寸整除时才有效,并且会numpy.array_split产生不均匀的尺寸。
使用示例 numpy.split
>> import numpy as np
>>> a = np.random.randint(6,size=(40))
>>> b = np.split(a,37)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/site-packages/numpy/lib/shape_base.py", line 508, in split
'array split does not result in an equal division')
ValueError: array split does not result in an equal …Run Code Online (Sandbox Code Playgroud) 这是一个示例代码.
df = pd.DataFrame(np.random.randn(10, 2), columns=list('AB'))
df['C'] = df.B.rolling(window=3)
Run Code Online (Sandbox Code Playgroud)
输出:
A B C
0 -0.108897 1.877987 Rolling [window=3,center=False,axis=0]
1 -1.276055 -0.424382 Rolling [window=3,center=False,axis=0]
2 1.578561 -1.094649 Rolling [window=3,center=False,axis=0]
3 -0.443294 1.683261 Rolling [window=3,center=False,axis=0]
4 0.674124 0.281077 Rolling [window=3,center=False,axis=0]
5 0.587773 0.697557 Rolling [window=3,center=False,axis=0]
6 -0.258038 -1.230902 Rolling [window=3,center=False,axis=0]
7 -0.443269 0.647107 Rolling [window=3,center=False,axis=0]
8 0.347187 0.753585 Rolling [window=3,center=False,axis=0]
9 -0.369179 0.975155 Rolling [window=3,center=False,axis=0]
Run Code Online (Sandbox Code Playgroud)
我希望我的'C'列是一个像[0.1231,-1.132,0.8766]这样的数组.我尝试使用滚动应用但是徒劳无功.
预期产出:
A B C
0 -0.108897 1.877987 []
1 -1.276055 -0.424382 []
2 1.578561 -1.094649 [-1.094649, …Run Code Online (Sandbox Code Playgroud) python ×6
numpy ×4
algorithm ×1
arrays ×1
dataframe ×1
filter ×1
keras ×1
matplotlib ×1
pandas ×1
python-2.7 ×1
scipy ×1
tensorflow ×1