我需要一个可在序列/迭代器/生成器上迭代的滚动窗口(也称为滑动窗口).默认的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) 有没有办法在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阵列.
给定一个包含噪声包围的已知模式的列表,是否有一种优雅的方式来获得与模式相同的所有项目.请参阅下面的原始代码.
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)
列表包含命名元组.
我在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的?
我有一个清单:
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)
建议?
我想在分类变量的数据框中找到一个向下行的模式.我可以看到如何使用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) 我有一个形状数组,(128, 36, 8)我想找到最后一个维度中长度为8的唯一子数组的出现次数.
我知道np.unique并且np.bincount,但那些似乎是元素而不是子阵列.我已经看到了这个问题,但它是关于找到特定子阵列的第一次出现,而不是所有独特子阵列的计数.
我有阵列:
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) 我有一个带有shape的3d数组(1000, 12, 30),并且有一个2d数组的shape列表(12, 30),我想要做的是检查3d数组中是否存在这些2d数组。Python中有一种简单的方法可以做到这一点吗?我尝试了关键字,in但是没有用。
请假设以下 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) 这是初学者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,但我确信这是一个更简单的答案.
谢谢你的帮助
我试图找出最快的方法来计算两个值在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,它会添加到计数器中,但我觉得必须有更快的方法来做到这一点,
谢谢