更新: - 这个问题在机器重启后解决了.还没有弄清楚为什么之前发生这种错误.
我有一个函数加载一个巨大的numpy数组(~980MB)并返回它.
当我第一次启动Ipython并调用此函数时,它会将数组加载到变量中而没有任何问题.
但是,如果我再次运行相同的命令,它将退出提出"内存错误".
我试过以下,
del hugeArray
Run Code Online (Sandbox Code Playgroud)
仍然发生同样的错误.我甚至尝试了以下内容
del hugeArray
gc.collect()
gc.collect()
Run Code Online (Sandbox Code Playgroud)
最初,gc.collect()返回145并且第二次调用返回48.但即使在此之后我调用该函数时,仍然会引发内存错误.
我可以再加载的唯一方法是重启ipython.我可以做些什么来释放ipython中的所有内存,以便我不必重新启动它?
----------------更新
以下是输出 %whos
Variable Type Data/Info
------------------------------
gc module <module 'gc' (built-in)>
gr module <module 'Generate4mRamp' <...>rom 'Generate4mRamp.pyc'>
np module <module 'numpy' from '/us<...>ages/numpy/__init__.pyc'>
plt module <module 'matplotlib.pyplo<...>s/matplotlib/pyplot.pyc'>
Run Code Online (Sandbox Code Playgroud)
除此之外,gr是我的模块,包含我用来加载数据立方体的函数.
---------如何重现错误
以下简单函数能够重现错误.
import numpy as np
import gc
def functionH():
cube=np.zeros((200,1024,1024))
return cube
testcube=functionH() #Runs without any issue
del testcube
testcube=functionH() # Raises Memory Error
del testcube
gc.collect()
gc.collect()
testcube=functionH() # Still Raises …Run Code Online (Sandbox Code Playgroud) 为了沿n维巨大的numpy数组的轴加速np.std,np.sum等函数,建议沿最后一个轴应用.
当我这样做时,np.transpose将我要操作的轴旋转到最后一个轴.它是真的重新调整内存中的数据,还是只改变轴的寻址方式?
当我尝试使用%timeit测量时间时.它在微秒内完成了这个转置,(比复制我所拥有的(112x1024x1024)阵列所需的时间要小得多.
如果它实际上并没有重新排序内存中的数据并只改变寻址,那么当应用于新旋转的最后一个轴时,它是否仍会加速np.sum或np.std?
当我试图测量它时,我似乎加快了速度.但我不明白怎么做.
它似乎并没有真正加速转置.最快的轴是C顺序时的最后一个轴,当它是Fortran排序时的第一个轴.因此,在应用np.sum或np.std之前进行转置是没有意义的.对于我的特定代码,我通过在数组创建期间给出order ='FORTRAN'来解决问题.这使第一轴最快.
感谢所有的答案.
是否可以使用Case Sensitive在gfortran中编译fortran 90/95代码?我搜索了手册,但是找不到任何我可以给gfortran的标志或选项以使其区分大小写.我想让大写和小写的变量不同.
那么,有可能吗?
我使用以下命令将我的一个github存储库克隆到我的办公桌面计算机
git clone git://github.com/indiajoe/MyRepo.git
Run Code Online (Sandbox Code Playgroud)
在进行一些更改并提交之后,我无法使用命令将更改推回到存储库,
git push -u orgin master
Run Code Online (Sandbox Code Playgroud)
以下是错误消息.
fatal: 'orgin' does not appear to be a git repository
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
Run Code Online (Sandbox Code Playgroud)
我试图重新输入地址,如下所示.
git remote rm origin
git remote add origin https://github.com/indiajoe/MyRepo.git
Run Code Online (Sandbox Code Playgroud)
即使在此之后,我也遇到了同样的错误.我的git remote -v的输出是
origin https://github.com/indiajoe/MyRepo.git (fetch)
origin https://github.com/indiajoe/MyRepo.git (push)
Run Code Online (Sandbox Code Playgroud)
这可能会出错?
PS:克隆时我无法通过以下命令通过https进行
git clone https://github.com/indiajoe/MyRepo.git
Run Code Online (Sandbox Code Playgroud)
但它克隆没有任何问题的命令,
git clone git://github.com/indiajoe/MyRepo.git
Run Code Online (Sandbox Code Playgroud)
我不知道,为什么会这样.但这可能是一个相关问题吗?
我正在尝试scipy.interpolation.griddata帮助文件中给出的第2个示例.它适用于"最近"的插值.但它使用填充了纳米的矩阵,同时使用任何其他插值,如"线性"或"立方体".如果我给出参数fill_value = 5,它给出填充5的矩阵.
这是由于某些安装问题吗?
我正在尝试他们在帮助文档中给出的完全相同的东西.但不知何故,它给出了结果,好像我要求插值的点位于输入点之外.(这不是!!我按照例子)
我将发布示例来重现错误(采取doc格式)
def func(x, y):
return x*(1-x)*np.cos(4*np.pi*x) * np.sin(4*np.pi*y**2)**2
grid_x, grid_y = np.mgrid[0:1:10j, 0:1:10j]
points = np.random.rand(100, 2)
values = func(points[:,0], points[:,1])
from scipy.interpolate import griddata
grid_z0 = griddata(points, values, (grid_x, grid_y), method='nearest')
grid_z1 = griddata(points, values, (grid_x, grid_y), method='linear')
grid_z2 = griddata(points, values, (grid_x, grid_y), method='cubic')
Run Code Online (Sandbox Code Playgroud)
我得到grid_z1和grid_z2是一个填充nan的矩阵.
更新:我在另一台Ubuntu 11.10机器上安装了所有软件包.并且相同的脚本给出了完全正确的答案.以前我在尝试使用Porteus发行版(实时slackware系列).因此,我认为我可以安全地得出结论,这是我的安装中的一些问题.任何人都知道什么可能出错?任何图书馆冲突都会导致这种行为吗?由于我的主机是Portues,我没有其他选择,只能修复其中的scipy.
我试图创建一个函数,它将矩阵作为输入,并在C++中输出它的一些功能.但我希望它能在任意大小的mxn矩阵上工作.即我不能在函数的参数中指定n的值(double matrix [] [n]).因为n会是任意的.有什么办法可以将任意mxn 2维数组传递给函数吗?提前感谢你.-indiajoe
我遇到了这个简洁的命令来检查bash中任何时区的时间
TZ=US/Hawaii date
Run Code Online (Sandbox Code Playgroud)
这与...相同
export TZ=US/Hawaii
date
Run Code Online (Sandbox Code Playgroud)
第一个命令如何工作,而以下命令不起作用?
test=6 echo $test
Run Code Online (Sandbox Code Playgroud) python的正则表达式是否具有与给定范围内的匹配数字相当的东西?
例如在bash中,你可以通过test {19..21} .txt匹配test19.txt,test20.txt,test21.txt
我不是在寻找正则表达式来匹配所有数字,如[1-2] [0-9].
我想只匹配从某个数字开始到另一个数字的特定系列数字.
更新:最终目标是使用re.compile()创建一个regexp对象,以便我可以使用它来搜索大的字符串列表.
我有一个二进制数据,我正在使用C程序读入一个长整数数组.
二进制数据的hexdump显示,在前几个数据点之后,它再次在20000十六进制地址之外的位置处开始.hexdump输出如下所示.
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
0020000 0000 0000 0053 0000 0064 0000 006b 0000
0020010 0066 0000 0068 0000 0066 0000 005d 0000
0020020 0087 0000 0059 0000 0062 0000 0066 0000
Run Code Online (Sandbox Code Playgroud)
...等等...但是当我通过典型fread命令将其读入长整数数组'数据'时
fread(data,sizeof(*data),filelength/sizeof(*data),fd);
Run Code Online (Sandbox Code Playgroud)
它填满了我的数据阵列中的所有零,直到它到达20000位置.之后,它正确读取数据.为什么要读取我的文件不存在的区域?或者我如何让它只读取我的文件,而不是文件之间的任何内容?
我知道它看起来像一个微不足道的问题,但即使在谷歌搜索一晚之后我也无法弄明白.任何人都可以建议我在哪里做错了吗?
其他信息:我正在研究GNU/Linux机器.(slax-atma发行版具体).我的C编译器是gcc.