相关疑难解决方法(0)

滚动或滑动窗口迭代器?

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

Numpy中1D阵列的滚动窗口?

有没有办法在Numpy中有效地实现1D阵列的滚动窗口?

例如,我有这个纯Python代码片段来计算1D列表的滚动标准偏差,其中observations是1D值列表,并且n是标准差的窗口长度:

stdev = []
for i, data in enumerate(observations[n-1:]):
    strip = observations[i:i+n]
    mean = sum(strip) / n
    stdev.append(sqrt(250*sum([(s-mean)**2 for s in strip])/(n-1)))
Run Code Online (Sandbox Code Playgroud)

有没有办法在Numpy中完全执行此操作,即没有任何Python循环?标准偏差是微不足道的numpy.std,但滚动窗口部分完全残留我.

我发现这篇关于Numpy滚动窗口的博文,但它似乎不适用于1D阵列.

python numpy window

34
推荐指数
5
解决办法
2万
查看次数

优雅查找列表中的子列表

给定一个包含噪声包围的已知模式的列表,是否有一种优雅的方式来获得与模式相同的所有项目.请参阅下面的原始代码.

list_with_noise = [7,2,1,2,3,4,2,1,2,3,4,9,9,1,2,3,4,7,4,3,1,2,3,5]
known_pattern = [1,2,3,4]
res = []


for i in list_with_noise:
    for j in known_pattern:
        if i == j:
            res.append(i)
            continue

print res
Run Code Online (Sandbox Code Playgroud)

我们会得到的 2, 1, 2, 3, 4, 2, 1, 2, 3, 4, 1, 2, 3, 4, 4, 3

奖励:如果不存在完整模式,则避免附加i(即,允许1,2,3,4但不允许1,2,3)

例子:

find_sublists_in_list([7,2,1,2,3,4,2,1,2,3,4,9,9,1,2,3,4,7,4,3,1,2,3,5],[1,2,3,4])

[1,2,3,4],[1,2,3,4],[1,2,3,4]


find_sublists_in_list([7,2,1,2,3,2,1,2,3,6,9,9,1,2,3,4,7,4,3,1,2,6],[1,2,3,4])

[1,2,3],[1,2,3],[1,2,3]
Run Code Online (Sandbox Code Playgroud)

列表包含命名元组.

python design-patterns list

26
推荐指数
2
解决办法
4万
查看次数

在二维数组的Vectorized移动的窗口在numpy

我在2D阵列上的恒定大小的移动窗口上应用操作.是否有一个有效的类似矢量化的操作,我可以实现这样做而无需在Python中循环?我目前的结构看起来像这样

 for i in range(1,xmax-1):
     for j in range(1,ymax-1):
        out[i][j] = f(in[i][j],in[i+1][j],in[i-1][j],in[i][j+1],in[i][j-1],...)
Run Code Online (Sandbox Code Playgroud)

这些评论可以留在这个问题暗指矢量化这种操作这种可能性,但没有进一步的细节矢量索引/切片在numpy的/ SciPy的?

python numpy vectorization

10
推荐指数
2
解决办法
3909
查看次数

在列表中查找子列表的开始和结束索引

我有一个清单:

greeting = ['hello','my','name','is','bob','how','are','you']
Run Code Online (Sandbox Code Playgroud)

我想定义一个函数,它将在此列表中找到子列表的第一个和最后一个索引.从而:

find_sub_list(['my','name','is'], greeting)
Run Code Online (Sandbox Code Playgroud)

应该返回:

1, 3
Run Code Online (Sandbox Code Playgroud)

建议?

python search list sublist

10
推荐指数
1
解决办法
7287
查看次数

Pandas - 查找与行序列模式匹配的行并将其编入索引

我想在分类变量的数据框中找到一个向下行的模式.我可以看到如何使用Series.shift()来查找/关闭并使用布尔逻辑来查找模式,但是,我想用分组变量执行此操作,并且还标记作为模式一部分的所有行,而不仅仅是起始行.

码:

import pandas as pd
from numpy.random import choice, randn
import string

# df constructor
n_rows = 1000
df = pd.DataFrame({'date_time': pd.date_range('2/9/2018', periods=n_rows, freq='H'),
                   'group_var': choice(list(string.ascii_uppercase), n_rows),
                   'row_pat': choice([0, 1, 2, 3], n_rows),
                   'values': randn(n_rows)})

# sorting 
df.sort_values(by=['group_var', 'date_time'], inplace=True)
df.head(10)
Run Code Online (Sandbox Code Playgroud)

哪个返回: 在此输入图像描述

我可以通过这个找到模式的开头(虽然没有分组):

# the row ordinal pattern to detect
p0, p1, p2, p3 = 1, 2, 2, 0 

# flag the row at the start of the pattern
df['pat_flag'] = \
df['row_pat'].eq(p0) & \
df['row_pat'].shift(-1).eq(p1) & \
df['row_pat'].shift(-2).eq(p2) …
Run Code Online (Sandbox Code Playgroud)

indexing row pandas

9
推荐指数
1
解决办法
1733
查看次数

有效地计算NumPy中唯一子阵列的出现次数?

我有一个形状数组,(128, 36, 8)我想找到最后一个维度中长度为8的唯一子数组的出现次数.

我知道np.unique并且np.bincount,但那些似乎是元素而不是子阵列.我已经看到了这个问题,但它是关于找到特定子阵列的第一次出现,而不是所有独特子阵列的计数.

python arrays numpy counting

8
推荐指数
1
解决办法
1523
查看次数

按模式查找布尔掩码

我有阵列:

arr = np.array([1,2,3,2,3,4,3,2,1,2,3,1,2,3,2,2,3,4,2,1])
print (arr)
[1 2 3 2 3 4 3 2 1 2 3 1 2 3 2 2 3 4 2 1]
Run Code Online (Sandbox Code Playgroud)

我想找到这个模式并返回booelan mask:

pat = [1,2,3]
N = len(pat)
Run Code Online (Sandbox Code Playgroud)

我用strides:

#https://stackoverflow.com/q/7100242/2901002
def rolling_window(a, window):
    shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
    strides = a.strides + (a.strides[-1],)
    c = np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
    return c
print (rolling_window(arr, N))
[[1 2 3]
 [2 3 2]
 [3 2 3]
 [2 3 4]
 [3 4 …
Run Code Online (Sandbox Code Playgroud)

python arrays boolean numpy stride

5
推荐指数
1
解决办法
281
查看次数

检查Python中的3d数组中是否存在2d数组?

我有一个带有shape的3d数组(1000, 12, 30),并且有一个2d数组的shape列表(12, 30),我想要做的是检查3d数组中是否存在这些2d数组。Python中有一种简单的方法可以做到这一点吗?我尝试了关键字,in但是没有用。

python numpy python-3.x pandas

5
推荐指数
1
解决办法
518
查看次数

自定义搜索 numpy 数组中的连续值

请假设以下 NumPy 数组:

A = array([1, 1, 0, 1, 0, 0, 0, 0, 0, 0])
Run Code Online (Sandbox Code Playgroud)

我想找到该数组的N连续值等于零(包括零)的索引。

例如,假设N=3. 我们知道,A[2]=0虽然A[3]>0. 因此,数组的第二个元素A不具有三个连续的零值(包括)。数组A的理想结果如下所示:

B = array([False, False, False, False, True, True, True, True, False, False])
Run Code Online (Sandbox Code Playgroud)

我可以写一个循环作为这个问题的答案:

N = 3
A = np.array([1, 1, 0, 0, 0, 0, 0, 0, 0, 0])
B = np.zeros(len(A), dtype=bool)
for i in range(len(A)):
   if (i + N <= len(A)) and (sum(A[i:i + N]) == 0):
      B[i] …
Run Code Online (Sandbox Code Playgroud)

python search numpy numpy-ndarray

5
推荐指数
2
解决办法
590
查看次数

测试给定数组的子数组

这是初学者Numpy用户的一个基本问题:我有一个5行2列的2D数组,你可以看到10个2d向量,我想测试一个给定的向量是否在表中.

例如 :

>>> tableau = array(range(10), dtype = uint8)
>>> tableau.shape = (5,2)
>>> print tableau
[[ 0  1]
 [ 2  3]
 [ 4  5]
 [ 6  7]
 [ 8  9]]
>>> [0, 1] in tableau
True
Run Code Online (Sandbox Code Playgroud)

最后一行给出了True,但在'tableau'中也是'[0,2].

目前,我计算欧几里得距离是否为0,但我确信这是一个更简单的答案.

谢谢你的帮助

python numpy

4
推荐指数
1
解决办法
1927
查看次数

计算numpy列表中项目的确切共同出现次数

我试图找出最快的方法来计算两个值在numpy列表中一个接一个地定位的时间.

例如:

list = [1, 5, 4, 1, 2, 4, 6, 7, 2, 1, 3, 3, 1, 2] 我想计算值1跟随值的次数2(但反之亦然)

在上面的例子中,答案应该是1因为1如下2只有一次.

我显然可以通过一个简单的for循环来达到答案,每次项目i相等1且item i-1等于时2,它会添加到计数器中,但我觉得必须有更快的方法来做到这一点,

谢谢

python numpy

3
推荐指数
1
解决办法
88
查看次数