小编epi*_*-tm的帖子

如何在 C++ 中有效地生成排序的均匀分布的随机数?

我想在 C++ 中生成大量有序且均匀分布的随机数,n, (即n >= 1,000,000,000)。

一首我认为,简单的方法是

  1. n使用std::uniform_real_distribution<double>,顺序生成均匀分布的数字,
  2. 然后使用std::sort.

但是,这需要几分钟时间。

一个第二和更先进的方法是做并行的两个步骤为:

template <typename T>
void computeUniformDistribution(std::vector<T>& elements)
{
    #pragma omp parallel
    {
        std::seed_seq seed{distribution_seed, static_cast<size_t>(omp_get_thread_num())};
        std::mt19937 prng = std::mt19937(seed);
        std::uniform_real_distribution<double> uniform_dist(0, std::numeric_limits<T>::max());

        #pragma omp for
        for (size_t i = 0; i < elements.size(); ++i)
        {
            elements[i] = static_cast<T>(uniform_dist(prng));
        }
    }

    std::sort(std::execution::par_unseq, elements.begin(), elements.end());
}
Run Code Online (Sandbox Code Playgroud)

但是,即使这样也需要大约30秒。鉴于均匀分布数字的生成只需要大约1.5秒,瓶颈仍然是排序阶段。

因此,我想问以下问题:如何以排序的方式有效地生成均匀分布的数据?

c++ sorting random algorithm c++17

29
推荐指数
2
解决办法
1648
查看次数

如何使用 Pandas 计算逗号分隔列的平均值?

让我们考虑以下 CSV 文件test.csv:

"x","y","A","B"
8000000000,"0,1","0.113948,0.113689",0.114042
8000000000,"0,1","0.114063,0.113823",0.114175
8000000000,"0,1","0.114405,0.114366",0.114524
8000000000,"0,1,2,3","0.167543,0.172369,0.419197,0.427285",0.427576
8000000000,"0,1,2,3","0.167784,0.172145,0.418624,0.426492",0.428736
8000000000,"0,1,2,3","0.168121,0.172729,0.419768,0.427467",0.428578

Run Code Online (Sandbox Code Playgroud)

我的目标是通过组的列线"x"和"y"和计算的算术平均值在列"A"和"B"。

我的第一个方法是使用的组合groupby(),并mean()在熊猫:

import pandas

if __name__ == "__main__":
    data = pandas.read_csv("test.csv", header=0)
    data = data.groupby(["x", "y"], as_index=False).mean()
    print(data)
Run Code Online (Sandbox Code Playgroud)

运行此脚本会产生以下输出:

            x        y         B
0  8000000000      0,1  0.114247
1  8000000000  0,1,2,3  0.428297
Run Code Online (Sandbox Code Playgroud)

正如我们所见,实现单值列的目标"B"很简单。但是,该列"A"被省略。相反,我希望该列"A"带有一个字符串,其中包含每个逗号分隔值的算术平均值。所需的输出应如下所示:

            x        y                                    A         B
0  8000000000      0,1                    0.114139,0.113959  0.114247
1  8000000000  0,1,2,3  0.167816,0.172414,0.419196,0.427081  0.428297
Run Code Online (Sandbox Code Playgroud)

有人知道怎么做这个吗?

python pandas

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

如何有效地按键合并k个排序的成对键/值向量?

我想k按键合并排序的成对键/值向量。n通常,向量的大小非常大(例如, n >= 4,000,000,000)。

\n

考虑以下示例k = 2:

\n
// Input\nkeys_1 = [1, 2, 3, 4], values_1 = [11, 12, 13, 14]\nkeys_2 = [3, 4, 5, 6], values_2 = [23, 24, 25, 26]\n\n// Output\nmerged_keys = [1, 2, 3, 3, 4, 4, 5, 6], merged_values = [11, 12, 13, 23, 14, 24, 25, 26]\n
Run Code Online (Sandbox Code Playgroud)\n

由于__gnu_parallel::multiway_merge它是一种高效的k单向合并算法,因此我尝试利用最先进的 zip 迭代器(https://github.com/dpellegr/ZipIterator)来“组合”键值对向量。

\n
#include <iostream>\n#include <vector>\n#include <parallel/algorithm>\n\n#include "ZipIterator.hpp"\n\nint main(int argc, char* argv[]) …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm merge gnu c++17

2
推荐指数
1
解决办法
359
查看次数

标签 统计

algorithm ×2

c++ ×2

c++17 ×2

gnu ×1

merge ×1

pandas ×1

python ×1

random ×1

sorting ×1