- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个包含测量值和相应权重的 pandas DataFrame:
df = pd.DataFrame({'x': np.random.randn(1000), 'w': np.random.rand(1000)})
我想在采用元素方式时平滑测量值 (x
)权重 (w
) 考虑在内。这与滑动窗口的权重无关,我也想申请(例如三角形窗口,或者更漂亮的东西)。因此,要计算每个窗口内的平滑值,该函数不仅应通过窗口函数(例如三角形),而且还应通过 w< 中的相应元素对
.x
的切片元素进行加权
据我所知,pd.rolling_apply
不会这样做,因为它应用了分别在 x
和 w
上给定函数。同样,pd.rolling_window
也不考虑源 DataFrame 的元素权重;加权窗口(例如“三角形”)可以是用户定义的,但预先固定。
这是我的慢速实现:
def rolling_weighted_triangle(x, w, window_size):
"""Smooth with triangle window, also using per-element weights."""
# Simplify slicing
wing = window_size // 2
# Pad both arrays with mirror-image values at edges
xp = np.r_[x[wing-1::-1], x, x[:-wing-1:-1]]
wp = np.r_[w[wing-1::-1], w, w[:-wing-1:-1]]
# Generate a (triangular) window of weights to slide
incr = 1. / (wing + 1)
ramp = np.arange(incr, 1, incr)
triangle = np.r_[ramp, 1.0, ramp[::-1]]
# Apply both sets of weights over each window
slices = (slice(i - wing, i + wing + 1) for i in xrange(wing, len(x) + wing))
out = (np.average(xp[slc], weights=triangle * wp[slc]) for slc in slices)
return np.fromiter(out, x.dtype)
我怎样才能用 numpy/scipy/pandas 加快速度?
dataframe 已经可以占用 RAM 的重要部分(10k 到 200M 行),例如预先为每个元素分配一个二维数组的窗口权重太多了。我试图尽量减少临时数组的使用,也许使用np.lib.stride_tricks.as_strided
和 np.apply_along_axis
或 np.convolve
,但还没有找到任何可以完全复制上述内容的东西。
这是一个统一窗口的等价物,而不是一个三角形(使用 get_sliding_window trick from here )——接近但不完全是:
def get_sliding_window(a, width):
"""Sliding window over a 2D array.
Source: https://stackoverflow.com/questions/37447347/dataframe-representation-of-a-rolling-window/41406783#41406783
"""
# NB: a = df.values or np.vstack([x, y]).T
s0, s1 = a.strides
m, n = a.shape
return as_strided(a,
shape=(m-width+1, width, n),
strides=(s0, s0, s1))
def rolling_weighted_average(x, w, window_size):
"""Rolling weighted average with a uniform 'boxcar' window."""
wing = window_size // 2
window_size = 2 * wing + 1
xp = np.r_[x[wing-1::-1], x, x[:-wing-1:-1]]
wp = np.r_[w[wing-1::-1], w, w[:-wing-1:-1]]
x_w = np.vstack([xp, wp]).T
wins = get_sliding_window(x_w, window_size)
# TODO - apply triangle window weights - multiply over wins[,:,1]?
result = np.average(wins[:,:,0], axis=1, weights=wins[:,:,1])
return result
最佳答案
你可以在那里简单地使用卷积,就像这样 -
def rolling_weighted_triangle_conv(x, w, window_size):
"""Smooth with triangle window, also using per-element weights."""
# Simplify slicing
wing = window_size // 2
# Pad both arrays with mirror-image values at edges
xp = np.concatenate(( x[wing-1::-1], x, x[:-wing-1:-1] ))
wp = np.concatenate(( w[wing-1::-1], w, w[:-wing-1:-1] ))
# Generate a (triangular) window of weights to slide
incr = 1. / (wing + 1)
ramp = np.arange(incr, 1, incr)
triangle = np.r_[ramp, 1.0, ramp[::-1]]
D = np.convolve(wp*xp, triangle)[window_size-1:-window_size+1]
N = np.convolve(wp, triangle)[window_size-1:-window_size+1]
return D/N
运行时测试
In [265]: x = np.random.randn(1000)
...: w = np.random.rand(1000)
...: WSZ = 7
...:
In [266]: out1 = rolling_weighted_triangle(x, w, window_size=WSZ)
...: out2 = rolling_weighted_triangle_conv(x, w, window_size=WSZ)
...: print(np.allclose(out1, out2))
...:
True
In [267]: %timeit rolling_weighted_triangle(x, w, window_size=WSZ)
...: %timeit rolling_weighted_triangle_conv(x, w, window_size=WSZ)
...:
100 loops, best of 3: 10.2 ms per loop
10000 loops, best of 3: 32.9 µs per loop
300x+
在那里加速!
关于python - 平滑 numpy/pandas 中的一系列加权值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46230222/
作为脚本的输出,我有 numpy masked array和标准numpy array .如何在运行脚本时轻松检查数组是否为掩码(具有 data 、 mask 属性)? 最佳答案 您可以通过 isin
我的问题 假设我有 a = np.array([ np.array([1,2]), np.array([3,4]), np.array([5,6]), np.array([7,8]), np.arra
numpy 是否有用于矩阵模幂运算的内置实现? (正如 user2357112 所指出的,我实际上是在寻找元素明智的模块化减少) 对常规数字进行模幂运算的一种方法是使用平方求幂 (https://en
我已经在 Numpy 中实现了这个梯度下降: def gradientDescent(X, y, theta, alpha, iterations): m = len(y) for i
我有一个使用 Numpy 在 CentOS7 上运行的项目。 问题是安装此依赖项需要花费大量时间。 因此,我尝试 yum install pip install 之前的 numpy 库它。 所以我跑:
处理我想要旋转的数据。请注意,我仅限于 numpy,无法使用 pandas。原始数据如下所示: data = [ [ 1, a, [, ] ], [ 1, b, [, ] ], [ 2,
numpy.random.seed(7) 在不同的机器学习和数据分析教程中,我看到这个种子集有不同的数字。选择特定的种子编号真的有区别吗?或者任何数字都可以吗?选择种子数的目标是相同实验的可重复性。
我需要读取存储在内存映射文件中的巨大 numpy 数组的部分内容,处理数据并对数组的另一部分重复。整个 numpy 数组占用大约 50 GB,我的机器有 8 GB RAM。 我最初使用 numpy.m
处理我想要旋转的数据。请注意,我仅限于 numpy,无法使用 pandas。原始数据如下所示: data = [ [ 1, a, [, ] ], [ 1, b, [, ] ], [ 2,
似乎 numpy.empty() 可以做的任何事情都可以使用 numpy.ndarray() 轻松完成,例如: >>> np.empty(shape=(2, 2), dtype=np.dtype('d
我在大型 numpy 数组中有许多不同的形式,我想使用 numpy 和 scipy 计算它们之间的边到边欧氏距离。 注意:我进行了搜索,这与堆栈中之前的其他问题不同,因为我想获得数组中标记 block
我有一个大小为 (2x3) 的 numpy 对象数组。我们称之为M1。在M1中有6个numpy数组。M1 给定行中的数组形状相同,但与 M1 任何其他行中的数组形状不同。 也就是说, M1 = [ [
如何使用爱因斯坦表示法编写以下点积? import numpy as np LHS = np.ones((5,20,2)) RHS = np.ones((20,2)) np.sum([ np.
假设我有 np.array of a = [0, 1, 1, 0, 0, 1] 和 b = [1, 1, 0, 0, 0, 1] 我想要一个新矩阵 c 使得如果 a[i] = 0 和 b[i] = 0
我有一个形状为 (32,5) 的 numpy 数组 batch。批处理的每个元素都包含一个 numpy 数组 batch_elem = [s,_,_,_,_] 其中 s = [img,val1,val
尝试为基于文本的多标签分类问题训练单层神经网络。 model= Sequential() model.add(Dense(20, input_dim=400, kernel_initializer='
首先是一个简单的例子 import numpy as np a = np.ones((2,2)) b = 2*np.ones((2,2)) c = 3*np.ones((2,2)) d = 4*np.
我正在尝试平均二维 numpy 数组。所以,我使用了 numpy.mean 但结果是空数组。 import numpy as np ws1 = np.array(ws1) ws1_I8 = np.ar
import numpy as np x = np.array([[1,2 ,3], [9,8,7]]) y = np.array([[2,1 ,0], [1,0,2]]) x[y] 预期输出: ar
我有两个数组 A (4000,4000),其中只有对角线填充了数据,而 B (4000,5) 填充了数据。有没有比 numpy.dot(a,b) 函数更快的方法来乘(点)这些数组? 到目前为止,我发现
我是一名优秀的程序员,十分优秀!