组合numpy数组以创建值字段

时间:2014-12-18 11:43:00

标签: python arrays numpy dimensions

我到目前为止编码:

from mpl_toolkits.mplot3d import Axes3D 
from matplotlib import cm
from scipy.special import *
import matplotlib.pyplot as plt
import numpy as np
from math import *
import csv

## Globale Variablen ## 
# kommen später ins main file, MÜSSEN vor dem import von diesem Modul definiert werden!)
rhof = 1000                          # Dichte Flüssigkeit [kg/m³]
lameu = 11.2*10**9                   # Lamé-Parameter, undrained [GPa]
lame = 8.4*10**9                     # Lamé-Parameter, drained [GPa]
pi                                   # durch Pythonmodul "math" gegeben
alpha = 0.65                         # Biot-Willis-Koeffizient
G = 8.4*10**9                        # Schermodul [GPa]
k = 1.0e-15                          # Permeabilität [m²] bzw. [Darcy] 
eta = 0.001                          # Viskosität des Fluids [Pa*s]

## Berechnung der Parameter ##

# Berechnung der Diffusivität 
kappa = k/eta                       
# Berechnung der Diffusivität 
c = ((kappa*(lameu-lame)*(lame+2*G))/((alpha**2)*(lameu+2*G)))   


## Wertebereich ##
xmin = 0
xmax = 50
xsteps = 1
x = np.arange(xmin,xmax,xsteps)
ymin = 0
ymax = 50
ysteps = 1
y = np.arange(ymin,ymax,ysteps)

#X, Y = np.meshgrid(x,y)

## Klassendefinition ##
# hier wird eine Bohrloch-Klasse definiert    
class Bohrloch(object):
    # __init__ erzeugt das eigentliche Objekt mit seinen Parametern
    def __init__(self, xlage, ylage, tstart, q):
        self.xlage = xlage           # x-Lage der Bohrung
        self.ylage = ylage           # y-Lage der Bohrung
        self.tstart = tstart         # Start der Injektion/Produktion
        self.q = q                   # Fluidmenge

#==============================================================================
#                                   Drücke
#==============================================================================

    # getPressure erzeugt einen Array mit allen Werten für x,y im Zeitraum t    
    def getPressure(self, t): 
        if (t-self.tstart<0):        # Förderzeit muss in Förderzeitraum liegen
            print "Startpunkt liegt außerhalb des Förderzeitraumes!"
            return () 

        else:
            # erzeugen des Abstandsvektors
            self.r = np.sqrt((x-self.xlage)**2+(y-self.ylage)**2)
            # Druckformel nach Rudnicki (1986)
            self.P = (self.q/(rhof*4*pi*kappa))*(expn(1,self.r**2/(4*c*(t-self.tstart))))
            # Druck wird direkt bei der Bohrung als "not a number" definiert
            self.P[self.xlage] = np.nan
            self.P[self.ylage] = np.nan
            # Umrechnung des Druckes in [MPa]
            self.z = self.P/1e6
            # return gibt die Druckwerte aus (und speichert sie zwischen)

            return self.z  

我遇到的问题是我找回了self.z的一维数组。代码背后的想法如下:

我有一个x轴和y轴,例如以上范围。我尝试获得这些1d阵列的每种可能组合的压力值(取决于x,y),例如, x,y = 1,1的值; 1,2; 1,3等在每个轴上直到50。如果我使用ndim测试我的数组self.z的维度,我看到我只覆盖了一个维度。所需的输出应该是50x50(或49x49)的二维数组,或者我错了?我真的坚持这个问题,我认为应该很容易解决,但我无法正确解决。后来我想用这些值绘制3D图,我知道我必须使用np.meshgrid来解决这个问题。我还必须在这里使用吗? 我希望你们能得到我的想法,并能提供帮助!

1 个答案:

答案 0 :(得分:1)

根据你的解释,问题在于你对'self.r'的定义 对于x和y的所有组合,即矩阵,您需要(x,y)和(xlage,ylage)之间的距离r的列表。但是,你有一个向量,其中包含属于(x1,y1),(x2,y2),(x3,y3)...的r,即你缺少组合(x1,y2),......等等。 / p>

解决方案是

# put this into section 'Wertebereich'
xx,yy = np.meshgrid(x,y)

# and change the function to
def getPressure(self, t): 
    if (t-self.tstart<0):        # Förderzeit muss in Förderzeitraum liegen
        print "Startpunkt liegt außerhalb des Förderzeitraumes!"
        return () 

    else:
        # erzeugen des Abstandsvektors
        self.r = np.sqrt((xx-self.xlage)**2+(yy-self.ylage)**2)
        # Druckformel nach Rudnicki (1986)
        self.P = (self.q/(rhof*4*pi*kappa))*(expn(1,self.r**2/(4*c*(t-self.tstart))))
        # Druck wird direkt bei der Bohrung als "not a number" definiert
        self.P = np.where((xx==self.xlage) & (yy==self.ylage),self.P,NaN)
        # Umrechnung des Druckes in [MPa]
        self.z = self.P/1e6
        # return gibt die Druckwerte aus (und speichert sie zwischen)

        return self.z

我现在无法检查代码,但它应该完成这项工作。

然后您可以使用xx,yy和输出z绘制它,如上所述here