xtensor 相当于 numpy a[a>3] = 1
xtensor equivalent of numpy a[a>3] = 1
标题说了 - numpy 的 xtensor 等价物是什么
# set all elements > 3 to 1
sometensor[sometensor > 3] = 1
?
看起来 xt::filter
有效:
xt::filter(sometensor, sometensor > 3) = 1
但看起来 numpy 版本要快得多。我用 xsimd 构建了 xtensor,但在这种情况下它似乎没有帮助。有没有更好、更simd-ish的方法?
编辑
我发现 filtration
,它确实更快(大约 3 倍),但仍然比 numpy 慢(大约 10 倍)...
解决方案(感谢汤姆!)
a = xt::where(a > 0.5, 1.0, a);
是所有速度中最快的 - 大约比 filtration
快 10 倍,所以它看起来像 simd-d!
xt::filter
似乎是一个视图,(目前)在 xtensor 中效率不高。我会使用 xt::where
。虽然它可能会导致暂时的,但在 NumPy 中可能并非如此。由于我不知道临时文件的详细信息,让我们至少做一些时间安排:
1。 NumPy 索引:
import numpy as np
from datetime import datetime
a = np.random.random([1000000])
start = datetime.now()
a[a > 0.5] = 1.0
stop = datetime.now()
print((stop - start).microseconds)
在我的系统上大约 5000 微秒。
2。 NumPy 哪里
import numpy as np
from datetime import datetime
a = np.random.random([1000000])
start = datetime.now()
a = np.where(a > 0.5, 1.0, a)
stop = datetime.now()
print((stop - start).microseconds)
在我的系统上大约 2500 微秒。
3。 xtensor
#include <iostream>
#include <chrono>
#include <xtensor.hpp>
using namespace std;
int main()
{
xt::xtensor<double, 1> a = xt::random::rand<double>({1000000});
auto start = std::chrono::high_resolution_clock::now();
a = xt::where(a > 0.5, 1.0, a);
auto stop = std::chrono::high_resolution_clock::now();
auto duration = duration_cast<std::chrono::microseconds>(stop - start);
cout << duration.count() << endl;
}
在我的系统上,使用 xsimd 在 2500 到 5000 微秒之间(比 NumPy 的分布要多得多),在没有 xsimd 的情况下大约是原来的两倍].
4。 xtensor 过滤器
#include <iostream>
#include <chrono>
#include <xtensor.hpp>
using namespace std;
int main()
{
xt::xtensor<double, 1> a = xt::random::rand<double>({1000000});
auto start = std::chrono::high_resolution_clock::now();
xt::filter(a, a > 0.5) = 1.0;
auto stop = std::chrono::high_resolution_clock::now();
auto duration = duration_cast<std::chrono::microseconds>(stop - start);
cout << duration.count() << endl;
}
在我的系统上,使用和不使用 xsimd.
大约 30000 微秒
编译
我用
cmake_minimum_required(VERSION 3.1)
project(Run)
set(CMAKE_BUILD_TYPE Release)
find_package(xtensor REQUIRED)
find_package(xsimd REQUIRED)
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} xtensor xtensor::optimize xtensor::use_xsimd)
没有xsimd 我省略了最后一行。
罗塞塔/原生
我是运行Mac的M1。列出的时间在 Rosetta 上(即 x86
)。对于本机构建,时间为:
- 4500 微秒。
- 1500 微秒。
- 2000 微秒,带和不带 xsimd(我认为 xsimd 还不能在那个芯片上工作!)。
- 15000 微秒。
标题说了 - numpy 的 xtensor 等价物是什么
# set all elements > 3 to 1
sometensor[sometensor > 3] = 1
?
看起来 xt::filter
有效:
xt::filter(sometensor, sometensor > 3) = 1
但看起来 numpy 版本要快得多。我用 xsimd 构建了 xtensor,但在这种情况下它似乎没有帮助。有没有更好、更simd-ish的方法?
编辑
我发现 filtration
,它确实更快(大约 3 倍),但仍然比 numpy 慢(大约 10 倍)...
解决方案(感谢汤姆!)
a = xt::where(a > 0.5, 1.0, a);
是所有速度中最快的 - 大约比 filtration
快 10 倍,所以它看起来像 simd-d!
xt::filter
似乎是一个视图,(目前)在 xtensor 中效率不高。我会使用 xt::where
。虽然它可能会导致暂时的,但在 NumPy 中可能并非如此。由于我不知道临时文件的详细信息,让我们至少做一些时间安排:
1。 NumPy 索引:
import numpy as np
from datetime import datetime
a = np.random.random([1000000])
start = datetime.now()
a[a > 0.5] = 1.0
stop = datetime.now()
print((stop - start).microseconds)
在我的系统上大约 5000 微秒。
2。 NumPy 哪里
import numpy as np
from datetime import datetime
a = np.random.random([1000000])
start = datetime.now()
a = np.where(a > 0.5, 1.0, a)
stop = datetime.now()
print((stop - start).microseconds)
在我的系统上大约 2500 微秒。
3。 xtensor
#include <iostream>
#include <chrono>
#include <xtensor.hpp>
using namespace std;
int main()
{
xt::xtensor<double, 1> a = xt::random::rand<double>({1000000});
auto start = std::chrono::high_resolution_clock::now();
a = xt::where(a > 0.5, 1.0, a);
auto stop = std::chrono::high_resolution_clock::now();
auto duration = duration_cast<std::chrono::microseconds>(stop - start);
cout << duration.count() << endl;
}
在我的系统上,使用 xsimd 在 2500 到 5000 微秒之间(比 NumPy 的分布要多得多),在没有 xsimd 的情况下大约是原来的两倍].
4。 xtensor 过滤器
#include <iostream>
#include <chrono>
#include <xtensor.hpp>
using namespace std;
int main()
{
xt::xtensor<double, 1> a = xt::random::rand<double>({1000000});
auto start = std::chrono::high_resolution_clock::now();
xt::filter(a, a > 0.5) = 1.0;
auto stop = std::chrono::high_resolution_clock::now();
auto duration = duration_cast<std::chrono::microseconds>(stop - start);
cout << duration.count() << endl;
}
在我的系统上,使用和不使用 xsimd.
大约 30000 微秒编译
我用
cmake_minimum_required(VERSION 3.1)
project(Run)
set(CMAKE_BUILD_TYPE Release)
find_package(xtensor REQUIRED)
find_package(xsimd REQUIRED)
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} xtensor xtensor::optimize xtensor::use_xsimd)
没有xsimd 我省略了最后一行。
罗塞塔/原生
我是运行Mac的M1。列出的时间在 Rosetta 上(即 x86
)。对于本机构建,时间为:
- 4500 微秒。
- 1500 微秒。
- 2000 微秒,带和不带 xsimd(我认为 xsimd 还不能在那个芯片上工作!)。
- 15000 微秒。