相关疑难解决方法(0)

移动平均线或平均线

是否有一个scipy函数或numpy函数或模块用于python,在给定特定窗口的情况下计算一维数组的运行平均值?

python numpy matplotlib scipy python-2.7

164
推荐指数
19
解决办法
29万
查看次数

滚动或滑动窗口迭代器?

我需要一个可在序列/迭代器/生成器上迭代的滚动窗口(也称为滑动窗口).默认的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)

python algorithm

142
推荐指数
10
解决办法
8万
查看次数

使用步幅进行有效的移动平均滤波器

我最近在这篇文章答案中学到了大步,并且想知道如何使用它们来比我在本文中提出的更有效地计算移动平均滤波器(使用卷积滤波器).

这就是我到目前为止所拥有的.它接受原始数组的视图然后将其滚动必要的量并将内核值相加以计算平均值.我知道边缘没有正确处理,但我可以在以后处理...有更好更快的方法吗?目标是过滤大到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)

编辑关于我如何看待这个工作的澄清:

当前代码:

  1. 使用stride_tricks生成一个类似[[0,1,2],[1,2,3],[2,3,4] ...]的数组,它对应于过滤器内核的顶行.
  2. 沿垂直轴滚动以获得内核[[10,11,12],[11,12,13],[13,14,15] ...]的中间行并将其添加到我得到的数组中1)
  3. 重复以获得内核的最后一行[[20,21,22],[21,22,23],[22,23,24] ...].此时,我取每行的总和除以滤波器中的元素数量,给出每个像素的平均值,(移动1行和1列,边缘有一些奇怪,但我可以稍后再照顾).

我希望的是更好地使用stride_tricks直接获取9个值或内核元素的总和,对于整个数组,或者有人可以说服我另一个更有效的方法......

python numpy image-processing filter

29
推荐指数
3
解决办法
3万
查看次数

使用Keras在滑动窗口中评估函数

我正在尝试在序列中扩展匹配匹配算法.我的比赛长20个单位,每个时间点有4个频道.我已经构建了一个封装匹配的模型,我无法弄清楚如何在滑动窗口中使用它来跨更长的序列应用它来查找序列中的匹配.

我有2个(20, 4)输入张量(querytarget),我连接,添加,展平,然后应用一个简单的密集层.我在这个阶段有数据来训练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)

python sliding-window conv-neural-network keras tensorflow

13
推荐指数
2
解决办法
2090
查看次数

将数组拆分为大小相等的窗口

我试图将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)

python arrays numpy

7
推荐指数
1
解决办法
7517
查看次数

Pandas滚动窗口返回一个数组

这是一个示例代码.

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 numpy dataframe pandas

6
推荐指数
4
解决办法
2451
查看次数