【问题标题】:How to use a large meshgrid without memory error in python?如何在 python 中使用没有内存错误的大型网格?
【发布时间】:2018-09-19 00:12:20
【问题描述】:

我正在尝试重现以下情节:

我正在使用两个变量的函数:skin_depth(T,rho)。 所以我决定使用meshgrid 并使用contourlines 进行绘图。 问题是它只适用于Trho 的一小部分。 当我尝试像上图那样使用 x 和 y 轴的范围时, 出现以下错误信息:


MemoryError Traceback(最近调用 最后)在() 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 在 meshgrid(*xi, **kwargs) 4696 4697 if copy_: -> 4698 输出 = [x.copy() for x in output] 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()

【问题讨论】:

  • 我可以很好地运行,我建议尽可能减少你的网格?检查您何时运行您的系统内存使用情况

标签: python matplotlib plot


【解决方案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

输出

【讨论】:

  • 非常感谢!之前尝试过使用logspace,但是不知道第二步用外积和flatten。现在效果很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-27
  • 2015-08-24
  • 1970-01-01
  • 1970-01-01
  • 2015-04-12
  • 1970-01-01
  • 2015-10-07
相关资源
最近更新 更多