python - 如何在 python 中使用没有内存错误的大型网格?
问题描述
我正在尝试重现以下情节:
我正在使用两个变量的函数:skin_depth(T,rho)
. 所以我决定使用meshgrid
and 来绘制使用contourlines
. 问题是它只适用于小范围的T
和rho
。当我尝试像上图那样使用 x 和 y 轴的范围时,会出现以下错误消息:
MemoryError Traceback (最近一次调用最后一次) in () 1 T = np.linspace(0.01,10000,10000) 2 rho = np.linspace(0.1,100000,1000000) ----> 3 X, Y = np.meshgrid (T,rho)
C:\Users\paula\Anaconda2\lib\site-packages\numpy\lib\function_base.pyc in meshgrid(*xi, **kwargs) 4696 4697 if copy_: -> 4698 output = [x.copy() for x在输出] 4699 4700 返回输出
内存错误:
有谁知道避免它的方法?下面是我的代码。
import numpy as np
import matplotlib.pyplot as plt
T = np.linspace(0.01,100,10000)
rho = np.linspace(0.1,1000,10000)
X, Y = np.meshgrid(T,rho)
skin_depth = 500*(np.sqrt(Y*X))
levels=np.array([10,20,30,40,50,60,70,80,90,100,200,300,400,500,600,700,800])
fig = plt.figure(figsize=(10,10))
CS = plt.contour(X,Y,skin_depth, levels, colors='k')
plt.clabel(CS, fontsize=9, inline=1, inlinespacing=1, fmt='%1.f')
plt.grid(True,which="both",ls="-")
plt.title('Skin Depth (m)')
plt.xlabel('Period [T(s)] ')
plt.ylabel('Resistivity [rho(ohm.m)]')
plt.xscale('log')
plt.yscale('log')
plt.show()
解决方案
linspace
我认为您正在为您的情节创建超过必要的中间网格点。
你在做:
T = np.linspace(0.01,10000,10000)
rho = np.linspace(0.1,1000000,1000000)
print (len(T)*len(rho))
> 10000000000
这意味着您正在创建一个包含100 亿个数据点的网格。
实际上,您需要一个logspace
. 您需要的网格点是0.01, 0.02, 0.03, ... 0.1, 0.2, 0.3, ...1, 2, 3,... 10, 20, 30, ... 100, 200, 300,...1000, 2000, 3000,...
等等,因为您在对数坐标系上。你可以打印T
,rho
现在看看我的意思。通过这样做,您只需要3402 个数据点。
因此,您基本上创建了比必要多七个数量级的数据点。
这是带有输出的修改后的初始数据。您可以添加更多级别以显示为黑色实线
a1 = np.logspace(-2, 4, 7) # Alternative a1 = 10.**(np.arange(-2, 5))
a2 = np.arange(1,10,1)
a3 = np.logspace(-1, 4, 6) # Alternative a3 = 10.**(np.arange(-1, 5))
T = np.outer(a1, a2).flatten()
rho = np.outer(a3, a2).flatten()
X, Y = np.meshgrid(T,rho)
fig = plt.figure(figsize=(8,5.5))
# Your code here
输出
推荐阅读
- asp.net - ComponentSpace.SAML 未能验证 XML 签名
- rust - 为什么将闭包传递给接受函数指针的函数不起作用?
- sql - 创建连接多个表的数据库视图
- angular5 - ngx-datatable的动态更新
- html - Uncaught (in promise): ReferenceError: Strophe is not defined
- go - 以固定的步长将字节读入 Go 缓冲区
- sql - 如何在 T-Sql 中自定义结果
- vue.js - VueJS 和 Axios 用于 prod env 的多个基本 URL
- markdown - MARKDOWN 粗体字
- swift - DateFormatter: dateFormat 毫秒 Swift