让我们用,例如, numpy.sin()
以下代码将返回数组的每个值的正弦值a:
import numpy
a = numpy.arange( 1000000 )
result = numpy.sin( a )
Run Code Online (Sandbox Code Playgroud)
但我的机器有32个核心,所以我想利用它们.(对于类似的东西,开销可能不值得,numpy.sin()但我实际想要使用的功能要复杂得多,而且我将使用大量数据.)
这是最好的(阅读:最聪明或最快)方法:
from multiprocessing import Pool
if __name__ == '__main__':
pool = Pool()
result = pool.map( numpy.sin, a )
Run Code Online (Sandbox Code Playgroud)
或者有更好的方法吗?
在python numexpr中安全地将值分配给您正在操作的同一个数组以避免创建临时数组吗?
从项目主页上的内存使用描述看起来没问题,但没有深入到源代码中,这几乎不是一个可靠的答案.
我尝试了下面哪个工作正常,但我希望得到更熟悉这个包的人的确认:
import numpy as np
import numexpr as ne
a = np.ones(5)
b = a.copy()
ne.evaluate("a+b",out=a)
array([ 2., 2., 2., 2., 2.])
Run Code Online (Sandbox Code Playgroud) 该数学函数的目的是使用二面角计算两个(或更多)蛋白质结构之间的距离:
例如,它在结构生物学中非常有用.我已经使用numpy在python中编写了这个函数,但目标是实现更快.作为计算时间参考,我使用scikit-learn包中提供的欧几里德距离函数.
这是我目前的代码:
import numpy as np
import numexpr as ne
from sklearn.metrics.pairwise import euclidean_distances
# We have 10000 structures with 100 dihedral angles
n = 10000
m = 100
# Generate some random data
c = np.random.rand(n,m)
# Generate random int number
x = np.random.randint(c.shape[0])
print c.shape, x
# First version with numpy of the dihedral_distances function
def dihedral_distances(a, b):
l = 1./a.shape[0]
return np.sqrt(l* np.sum((0.5)*(1. - np.cos(a-b)), axis=1))
# Accelerated version with numexpr
def dihedral_distances_ne(a, b):
l = …Run Code Online (Sandbox Code Playgroud) 我经常需要对大型numpy数组(几十亿个元素)进行排序,这成了我代码的瓶颈.我正在寻找一种并行化的方法.
该ndarray.sort()功能是否有任何并行实现?Numexpr模块为numpy数组上的大多数数学运算提供并行实现,但缺乏排序功能.
也许,有可能围绕C++并行排序实现一个简单的包装,并通过Cython使用它?
以下问题
并且他们各自的答案让我想到我如何能够有效地解析一个(或多或少可信的)用户给出的单个数学表达式(一般来说,就这个答案而言)/sf/answers/41600611/来自数据库的20k到30k输入值.我实施了快速而肮脏的基准测试,因此我可以比较不同的解
# Runs with Python 3(.4)
import pprint
import time
# This is what I have
userinput_function = '5*(1-(x*0.1))' # String - numbers should be handled as floats
demo_len = 20000 # Parameter for benchmark (20k to 30k in real life)
print_results = False
# Some database, represented by an array of dicts (simplified for this example)
database_xy = []
for a in range(1, demo_len, 1):
database_xy.append({
'x':float(a),
'y_eval':0,
'y_sympya':0,
'y_sympyb':0,
'y_sympyc':0,
'y_aevala':0, …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 python 中的 lux 库来获取可视化建议。它显示警告,例如NumExpr 默认为 8 个线程。。
import pandas as pd
import numpy as np
import opendatasets as od
pip install lux-api
import lux
import matplotlib
Run Code Online (Sandbox Code Playgroud)
进而:
link = "https://www.kaggle.com/noordeen/insurance-premium-prediction"
od.download(link)
df = pd.read_csv("./insurance-premium-prediction/insurance.csv")
Run Code Online (Sandbox Code Playgroud)
我一直在试验和尝试学习Numexpr包。关于如何使用它的示例充其量是稀疏的。有人可以给我一个关于如何使用“local_dict”和“global_dict”参数的快速示例吗?
测试代码:
import numpy as np
import pandas as pd
COUNT = 1000000
df = pd.DataFrame({
'y': np.random.normal(0, 1, COUNT),
'z': np.random.gamma(50, 1, COUNT),
})
%timeit df.y[(10 < df.z) & (df.z < 50)].mean()
%timeit df.y.values[(10 < df.z.values) & (df.z.values < 50)].mean()
%timeit df.eval('y[(10 < z) & (z < 50)].mean()', engine='numexpr')
Run Code Online (Sandbox Code Playgroud)
我的机器上的输出(使用Python 3.6的相当快的x86-64 Linux桌面)是:
17.8 ms ± 1.3 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
8.44 ms ± 502 µs per loop (mean ± std. dev. …Run Code Online (Sandbox Code Playgroud) 我有两个 numpy 布尔数组(a和b)。我需要找出它们有多少个元素相等。目前,我这样做len(a) - (a ^ b).sum(),但据我所知,异或操作创建了一个全新的 numpy 数组。如何在不创建不必要的临时数组的情况下有效地实现这种所需的行为?
我尝试过使用 numexpr,但我无法让它正常工作。它不支持 True 为 1、False 为 0 的概念,所以我必须使用ne.evaluate("sum(where(a==b, 1, 0))"),这大约需要两倍的时间。
编辑:我忘记提及其中一个数组实际上是另一个不同大小的数组的视图,并且两个数组都应该被认为是不可变的。两个数组都是二维的,大小通常约为 25x40。
是的,这就是我程序的瓶颈,值得优化。