Выполнение вычислений по сетке x, y в Python

Я хотел бы выполнить вычисление по данным X, Y, чтобы получить вычисленное Z. Мой код ниже:

Пример набора данных для injection_wells.csv

      import pandas as pd
import math
import numpy as np
import matplotlib.mlab as mlab
import matplotlib.tri as tri

IW = pd.read_csv (r'Injection_wells.csv')

`Note that - Injection wells is a table of three wells with names, X, Y, and Q (flow rate).`

#pull all the relevant well information by well into their own arrays

MW1 = IW[IW['Name'] == 'MW1']
MW2 = IW[IW['Name'] == 'MW2']
MW3 = IW[IW['Name'] == 'MW3']

#initiate grid
xi = np.linspace(2517675,2517800,625)
yi = np.linspace(996300,996375,375)

#make it so i can apply np.float to an array
vector = np.vectorize(np.float)

X,Y = np.meshgrid(xi,yi)

#perform calculation over every X and Y.
PSI = ((MW1['Q']/(2*math.pi))*(np.arctan(((vector(X[None,:]))-np.float(MW1['X']))/(vector(Y[:,None])-np.float(MW1['Y']))))+
      (MW2['Q']/(2*math.pi))*(np.arctan(((vector(X[None,:])-np.float(MW2['X']))/vector((Y[:,None])-np.float(MW2['Y'])))))+
      (MW3['Q']/(2*math.pi))*(np.arctan(((vector((X[None,:])-np.float(MW3['X']))/vector((Y[:,None])-np.float(MW3['Y'])))))))

Я получаю сообщение об ошибке:

      ValueError                                Traceback (most recent call last)
<ipython-input-11-fd6ee058014f> in <module>
     17 X,Y = np.meshgrid(xi,yi)
     18 
---> 19 PSI = ((MW1['Q']/(2*math.pi))*(np.arctan(((vector(X[None,:]))-np.float(MW1['X']))/(vector(Y[:,None])-np.float(MW1['Y']))))+
     20       (MW2['Q']/(2*math.pi))*(np.arctan(((vector(X[None,:])-np.float(MW2['X']))/vector((Y[:,None])-np.float(MW2['Y'])))))+
     21       (MW3['Q']/(2*math.pi))*(np.arctan(((vector((X[None,:])-np.float(MW3['X']))/vector((Y[:,None])-np.float(MW3['Y'])))))))

~\Anaconda3\lib\site-packages\pandas\core\ops\common.py in new_method(self, other)
     63         other = item_from_zerodim(other)
     64 
---> 65         return method(self, other)
     66 
     67     return new_method

~\Anaconda3\lib\site-packages\pandas\core\ops\__init__.py in wrapper(left, right)
    343         result = arithmetic_op(lvalues, rvalues, op)
    344 
--> 345         return left._construct_result(result, name=res_name)
    346 
    347     wrapper.__name__ = op_name

~\Anaconda3\lib\site-packages\pandas\core\series.py in _construct_result(self, result, name)
   2755         # We do not pass dtype to ensure that the Series constructor
   2756         #  does inference in the case where `result` has object-dtype.
-> 2757         out = self._constructor(result, index=self.index)
   2758         out = out.__finalize__(self)
   2759 

~\Anaconda3\lib\site-packages\pandas\core\series.py in __init__(self, data, index, dtype, name, copy, fastpath)
    311                 try:
    312                     if len(index) != len(data):
--> 313                         raise ValueError(
    314                             f"Length of passed values is {len(data)}, "
    315                             f"index implies {len(index)}."

ValueError: Length of passed values is 375, index implies 1.

Я знаю, что это как-то связано с тем, что я пытаюсь применить функцию к массиву, который принимает только одно значение. Я пытаюсь решить эту проблему и иметь возможность выполнять этот расчет как есть для всего набора данных с координатной привязкой. Любая помощь по этому вопросу будет принята с благодарностью.

Уравнение, которое я пытаюсь сделать, приведено ниже. Обратите внимание, что тета в уравнении - это дуга tan расстояния от узла сетки до нагнетательной скважины (для каждого узла сетки), которую я пытаюсь воспроизвести в коде.

Спасибо

1 ответ

Решение

Я собираюсь перейти на новый уровень, так как думаю, что теперь понимаю проблему, посмотрев на нее еще немного.

Итак, у вас есть DataFrame данных нагнетательной скважины с четырьмя столбцами:

      name    x    y    q
str   int  int  int

И у тебя есть функция f(x, y, q) -> zчто вы хотите оценить. Я не уверен, что точно слежу за тем, что делает ваша функция, потому что она отформатирована таким образом, что ее довольно трудно читать, поэтому я воспользуюсь упрощенным примером:

      def func(x, y, q):
    return (q / 2 * np.pi) * np.arctan(y, x)

Теперь вместо того, чтобы разбивать данные скважины на разные массивы, просто примените функцию ко всему фрейму данных построчно:

      df["z"] = func(df.x, df.y, df.q)
Другие вопросы по тегам