如何在python中使用没有内存错误的大型meshgrid?

问题描述 投票:0回答:1

我想重现以下情节:

enter image description here

我正在使用两个变量的函数:skin_depth(T,rho)。所以我决定使用meshgrid并使用contourlines绘图。问题是它只适用于小范围的Trho。当我尝试使用上图中的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(* xi,** kwargs)4696 4697如果copy_: - > 4698输出= [x.copy()for x在输出中] 4699 4700返回输出

的MemoryError:

有谁知道避免它的方法?以下是我的代码。

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()
python matplotlib plot
1个回答
1
投票

我认为你正在用你的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,...等等,因为你在对数坐标系上。你现在可以打印Trho来看看我的意思。通过这样做,您只需要3402个数据点。

所以你基本上创造了比必要数据点多7个数量级的数据点。

这是修改后的输出初始数据。您可以添加更多级别以显示为纯黑线

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

产量

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.