当我比较我的函数中的两个numpy数组时,我得到一个错误,说只有长度为1的数组可以转换为Python标量:
from numpy.random import rand
from numba import autojit
@autojit
def myFun():
a = rand(10,1)
b = rand(10,1)
idx = a > b
return idx
myFun()
Run Code Online (Sandbox Code Playgroud)
错误:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-7-f7b68c0872a3> in <module>()
----> 1 myFun()
/Users/Guest/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/numba/numbawrapper.so in numba.numbawrapper._NumbaSpecializingWrapper.__call__ (numba/numbawrapper.c:3764)()
TypeError: only length-1 arrays can be converted to Python scalars
Run Code Online (Sandbox Code Playgroud) 我需要读取存储在内存映射文件中的巨大numpy数组的部分内容,处理数据并重复数组的另一部分.整个numpy阵列占用大约50 GB,我的机器有8 GB的RAM.
我最初使用numpy.memmap创建了内存映射文件,方法是读入许多较小的文件并处理它们的数据,然后将处理后的数据写入memmap文件.在创建memmap文件的过程中,我没有内存问题(我定期使用memmap.flush()).这是我如何创建内存映射文件:
mmapData = np.memmap(mmapFile,mode='w+', shape=(large_no1,large_no2))
for i1 in np.arange(numFiles):
auxData = load_data_from(file[i1])
mmapData[i1,:] = auxData
mmapData.flush() % Do this every 10 iterations or so
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试访问memmap文件的小部分(<10 MB)时,它会在创建memmap对象时泛滥我的整个ram.机器急剧减速,我无能为力.以下是我尝试从内存映射文件中读取数据的方法:
mmapData = np.memmap(mmapFile, mode='r',shape=(large_no1,large_no2))
aux1 = mmapData[5,1:1e7]
Run Code Online (Sandbox Code Playgroud)
我认为使用mmap或numpy.memmap应该允许我访问大量数组的部分而不试图将整个内容加载到内存中.我错过了什么?
我是否使用错误的工具访问存储在磁盘中的大型numpy阵列(> 20 GB)的部分?
我非常喜欢Xcode黄昏色主题,我试图为我的Aquamacs/Emacs获得类似的东西.我似乎找不到任何东西.感谢任何帮助!
我正在尝试将IPython Parallel用于一个非常常见的场景,我想在运行Sun Grid Engine的集群上运行模拟,我找不到可行的方法来执行此操作.
这是我想要做的:
我想用几个不同的参数值运行数值模拟(使用Numpy数组) - 这些任务显然是''令人尴尬'并行.我有权(通过ssh)访问运行Grid Engine的集群的头节点.直到现在,我使用QSUB命令运行shell脚本,但这非常笨拙(处理节点崩溃等),我正在寻找一种方法来解决所有这些问题.
IPython似乎非常适合这种情况,但是让设置顺利运行变得非常麻烦.我在头节点上使用IPCLUSTER启动n(比方说20个)引擎,然后将.json文件复制到我使用IPython.parallel.Client连接的本地机器.
我已 IPClusterStart.controller_launcher_class = 'SGEControllerLauncher'
和IPClusterEngines.engine_launcher_class = 'SGEEngineSetLauncher'
IPCLUSTER似乎运行良好; 我从ssh终端的头节点获得此输出:
-- [IPClusterStart] Starting Controller with SGEControllerLauncher
-- [IPClusterStart] Job submitted with job id: '143396'
-- [IPClusterStart] Starting 4 Engines with SGEEngineSetLauncher
-- [IPClusterStart] Job submitted with job id: '143397'
-- [IPClusterStart] Engines appear to have started successfully
Run Code Online (Sandbox Code Playgroud)
但是,我有这些问题:
很多时候,即使我看到上面的消息说发动机已成功启动,许多发动机也无法向控制器注册.当我用20个引擎启动IPCLUSTER时,我可以看到10-15个引擎出现在Grid Engine队列上.我不知道其他引擎会发生什么 - 没有输出文件.在这些10-15个引擎中,只有一些引用了控制器注册,我在输出文件中看到了这个:
... [IPEngineApp] Using existing profile dir: .../.ipython/profile_sge'
... [IPEngineApp] Loading url_file ... .ipython/profile_sge/security/ipcontroller-engine.json'
... [IPEngineApp] Registering with controller …Run Code Online (Sandbox Code Playgroud)SO 有很多问题看起来是相同的,但它们并没有真正完全回答我的问题。我认为这对于计算科学家来说是一个非常常见的用例,所以我正在创建一个新问题。
问题:
我从文件中读取了几个小的 numpy 数组(每个约 10 MB)并对它们进行一些处理。我想创建一个更大的数组 (~1 TB),其中数组中的每个维度都包含这些较小文件之一的数据。任何试图在 RAM 中创建整个较大数组(或其大部分)的方法都是不合适的,因为它会淹没 RAM 并使机器停止运行。因此,我需要能够初始化较大的数组并小批量填充它,以便每个批次都写入磁盘上的较大数组。
我最初认为 numpy.memmap 是可行的方法,但是当我发出类似的命令时
mmapData = np.memmap(mmapFile,mode='w+', shape=(large_no1,large_no2))
Run Code Online (Sandbox Code Playgroud)
RAM 泛滥,机器速度减慢直至停止。
经过一番探索后,PyTables 似乎很适合这类事情,但我不太确定。此外,很难在文档或其他地方找到一个简单的示例来说明这种常见的用例。
如果有人知道如何使用 PyTables 来完成此操作,或者有更有效/更快的方法来完成此操作,请告诉我!任何参考文献。给个例子表示赞赏!
我尝试在MATLAB和NumPy上分析EIG功能,以比较我的Macbook Pro(2 GHz,运行OS X 10.6的Quad core i7)的性能.与MATLAB相比,NumPy EIG似乎相当慢.
这是我在NumPy上描述的代码:
s = '''\
x = numpy.random.random((2000,2000));
numpy.linalg.eig(x);
'''
t = timeit.Timer(stmt=s,setup="import numpy")
result = t.repeat(repeat=5,number=10)
result
Out[22]:
[197.1737039089203,
197.34872913360596,
196.8160741329193,
197.94081807136536,
194.5740351676941]
Run Code Online (Sandbox Code Playgroud)
在NumPy中大约是19.5秒/执行.
这是MATLAB中的相同代码:
clear all
tic;
for i = 1:50
x = rand(2000,2000);
eig(x);
end
toc;
Elapsed time is 267.976645 seconds.
Run Code Online (Sandbox Code Playgroud)
在MATLAB 上大约是5.36秒/执行.
我想这个简单的东西不应该在很大程度上取决于JIT的性能,所以它可能归结为BLAS和访问BLAS库的例程.我知道MATLAB在Mac上使用Accelerate Framework.
NumPy似乎也在我的Macbook Pro上使用Accelerate Framework BLAS; 这是输出numpy.show_config()
numpy.show_config()
lapack_opt_info:
extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
extra_compile_args = ['-msse3']
define_macros = [('NO_ATLAS_INFO', 3)]
blas_opt_info:
extra_link_args …Run Code Online (Sandbox Code Playgroud) 我有一个非常简单的函数,它使用Numpy数组和for循环,但添加Numba @jit装饰器绝对没有加速:
# @jit(float64[:](int32,float64,float64,float64,int32))
@jit
def Ising_model_1D(N=200,J=1,T=1e-2,H=0,n_iter=1e6):
beta = 1/T
s = randn(N,1) > 10
s[N-1] = s[0]
mag = zeros((n_iter,1))
aux_idx = randint(low=0,high=N,size=(n_iter,1))
for i1 in arange(n_iter):
rnd_idx = aux_idx[i1]
s_1 = s[rnd_idx]*2 - 1
s_2 = s[(rnd_idx+1)%(N)]*2 - 1
s_3 = s[(rnd_idx-1)%(N)]*2 - 1
delta_E = 2.0*J*(s_2+s_3)*s_1 + 2.0*H*s_1
if(delta_E < 0):
s[rnd_idx] = np.logical_not(s[rnd_idx])
elif(np.exp(-1*beta*delta_E) >= rand()):
s[rnd_idx] = np.logical_not(s[rnd_idx])
s[N-1] = s[0]
mag[i1] = (s*2-1).sum()*1.0/N
return mag
Run Code Online (Sandbox Code Playgroud)
另一方面,MATLAB运行时间不到0.5秒!为什么Numba遗漏了这么基本的东西?