在 Pandas 中,有一个方法 DataFrame.shift(n) 将数组的内容相对于索引移动 n 行,类似于 np.roll(a, n)。我似乎无法找到一种使用 Dask 获得类似行为的方法。我意识到使用 Dask 的分块系统可能难以管理诸如行移位之类的事情,但我不知道将每一行与后续行进行比较的更好方法。
我希望能够做的是:
import numpy as np
import pandas as pd
import dask.DataFrame as dd
with pd.HDFStore(path) as store:
data = dd.from_hdf(store, 'sim')[col1]
shifted = data.shift(1)
idx = data.apply(np.sign) != shifted.apply(np.sign)
Run Code Online (Sandbox Code Playgroud)
为了创建一个布尔系列,指示数据中符号变化的位置。(我知道该方法也会捕获从有符号值到零的更改)然后我将使用布尔系列来索引不同的 Dask 数据框以进行绘图。
我正在编写一个包装私有的容器存储类模板,std::array以便为它添加一些功能.模板参数化值的数量,如下所示:
template<size_t N> class Vector {
private:
array<double, N> vals;
public:
[...]
};
Run Code Online (Sandbox Code Playgroud)
我希望类的构造函数只接受N双精度来填充数组,但我找不到一个好方法来做到这一点.变量论证不提供一种机制来检查它们中有多少,所以它们是正确的.参数包不进行浮点提升,但如果我只能弄清楚如何使用它们,我愿意处理它.
我已经尝试在成员函数模板的答案中遵循该方法,参数的数量取决于整数模板参数,但我无法理解重要性enable_if<>::type=0部分.我试过天真地复制那些代码(虽然我更喜欢它是如何工作的.我看到人们::value在其他地方使用但是我找不到任何关于原因的文档)但是扩展生成的参数包不会似乎工作.我对参数包的另一个顾虑是,我不确定他们是否确保所有参数的类型都相同.
我已经尝试static_assert在构造函数的主体中运行初始化列表的大小,但当然列表的大小在编译时不是常量,所以这也不起作用.
这里有标准方法吗?我只是使用参数包错误吗?
template<size_t N> class Vector {
private:
array<double, N> vals;
public:
template <typename ...T,
typename enable_if<sizeof...(T) == N, int>::type = 0>
Vector(T ...args) {
vals = {args...};
}
};
Run Code Online (Sandbox Code Playgroud)
现在的问题是enable_if模板中的术语意味着当我初始化a Vector时,例如,
Vector<3> V {1.0, 2.0, 3.0};
Run Code Online (Sandbox Code Playgroud)
它要求模板专业化Vector<3>::Vector<double, double, double, 0>而不是<double, double, double> …