小编Kar*_*Man的帖子

Numba autojit在比较numpy数组时出错

当我比较我的函数中的两个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)

python numpy numba

9
推荐指数
1
解决办法
932
查看次数

numpy数组的内存映射文件

我需要读取存储在内存映射文件中的巨大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)的部分?

memory numpy large-files large-data

6
推荐指数
1
解决办法
1382
查看次数

Emacs颜色主题看起来像Xcode黑暗

我非常喜欢Xcode黄昏色主题,我试图为我的Aquamacs/Emacs获得类似的东西.我似乎找不到任何东西.感谢任何帮助!

emacs xcode aquamacs

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

在Sun Grid Engine上使用IPython Parallel

我正在尝试将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)

但是,我有这些问题:

  1. 很多时候,即使我看到上面的消息说发动机已成功启动,许多发动机也无法向控制器注册.当我用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)

ipython sungridengine ipython-parallel

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

以小块的形式创建非常大的 NUMPY 数组(PyTables 与 numpy.memmap)

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 来完成此操作,或者有更有效/更快的方法来完成此操作,请告诉我!任何参考文献。给个例子表示赞赏!

python mmap numpy large-files pytables

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

在Mac OS X 10.6上,Numpy EIG比MATLAB EIG慢大约4倍.我究竟做错了什么?

我尝试在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)

macos numpy blas accelerate-framework

3
推荐指数
1
解决办法
1293
查看次数

Numba @jit无法优化简单的功能

我有一个非常简单的函数,它使用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遗漏了这么基本的东西?

python numpy numba

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