Я отредактировал этот пост, чтобы упростить ситуацию, но оригинал ниже.
Я в основном хочу сделать некоторую математику для массива, который имеет такое же количество столбцов, но разные строки для ряда входов.Так что сделайте вычисление, используя входной массив столбцов (1 строка), где вычисления применяются построчно для большего массива.Массив большего размера имеет то же количество столбцов, что и входные.Количество столбцов будет варьироваться в зависимости от того, какие вычисления я делаю, но два входа всегда будут иметь одинаковое количество столбцов;например, массив 1 равен (2000L, 3L), массив 2 будет (1L, 3L), а если массив 1 равен (3050L, 5L), массив 2 (1L, 5L) и так далее.
Вот пример, который я сейчас пробую:
# Make data (for 3 components):
K1, K2, K3 = 30., 16., 36.
G1, G2, G3 = 12., 15., 44.
G = np.array([[G1, G2, G3]])
K = np.array([[K1, K2, K3]])
# Fake data:
fracs = np.array([[0.3,0.6,0.1],[0.5,0.3,0.2],[0.6,0.0,0.4],[0.2,0.8,0.0],[0.1,0.3,0.6]])
def reuss(fracs, K, G):
rK = 1.0 / (np.sum(fracs/K))
rG = 1.0 / (np.sum(fracs/G))
return rK, rG
# Do the function
Kr, Gr = reuss(fracs, K, G)
Что дает мне:
In[]: fracs
Out[]:
array([[ 0.3, 0.6, 0.1],
[ 0.5, 0.3, 0.2],
[ 0.6, 0. , 0.4],
[ 0.2, 0.8, 0. ],
[ 0.1, 0.3, 0.6]])
In[]: K, G
Out[]: (array([[ 30., 16., 36.]]), array([[ 12., 15., 44.]]))
In[]: Kr, Gr
Out[]: (nan, nan)
Я знаю, что вы можете транслировать скаляры, но что яхочу сделать, это иметь одну функцию, которая позволит мне транслировать массив входов.
ОРИГИНАЛЬНАЯ ПОЧТА ЗДЕСЬ ДЛЯ ПОЛНОСТИв скале.На данный момент я очень долго писал это для системы n фракций и n минеральных фаз.Это мой вставленный код (который очень плохой):
# Reuss isostress bound
def reuss3(K1, G1, K2=None, G2=None, K3=None, G3=None, PHI, f1=1.0, f2=None, f3=None, Kf, Gf=None):
'''
Calculates the Reuss lower bound of Bulk and Shear Moduli.
Also known as the isostress bound. Represents a suspension of grains.
Default assumes 1 rock phase, this function can be expanded to 3.
Form taken from Mavko et.al (2009) p.174
Arguments:
K# = Effective Bulk modulus of phase # in GPa
G# = Effective Shear modulus of phase # in GPa
PHI = Porosity fraction of mixture
f# = Fraction of phase #, default is 100% of phase 1
Kf, Gf = Moduli of fluid, default assumes fluid has 0 shear modulus
Results:
Kr = Reuss bound of Bulk modulus in GPa
Gr = Reuss bound of Shear modulus in GPa
'''
Kr = 1. /( (((1.-PHI)/K1)*f1) + (((1.-PHI)/K2)*f2) + (((1.-PHI)/K3)*f3) + (PHI/Kf) )
Gr = 1. /( (((1.-PHI)/G1)*f1) + (((1.-PHI)/G2)*f2) + (((1.-PHI)/G3)*f3) + (PHI/Gf) )
return Kr, Gr
Я пытался улучшить это и на самом деле моделировать среднее значение по Ройсу для реальных пород по их известному составу, пористости и водонасыщенности.Мои входные данные для этого представляют собой серию минеральных фракций, которые составляют 1 пробу в измерении глубины, поэтому в основном это двумерный массив с ( n выборок, n фаз).Я понятия не имею, как взять массив свойств минералов в одномерном массиве ( n фаз) и выполнить расчет для каждого образца глубины.До сих пор я пробовал это, которое выдает данные nan:
# Make data (for 3 components):
K1, K2, K3 = 30., 16., 36.
G1, G2, G3 = 12., 15., 44.
G = np.array([[G1, G2, G3]])
K = np.array([[K1, K2, K3]])
# Fake data:
fracs = np.array([[0.3,0.6,0.1],[0.5,0.3,0.2],[0.6,0.0,0.4],[0.2,0.8,0.0],[0.1,0.3,0.6]])
def reuss(fracs, K, G):
rK = 1.0 / (np.sum(fracs/K))
rG = 1.0 / (np.sum(fracs/G))
return rK, rG
# Do the function
rK, rG = reuss(fracs, K, G)
Я полагаю, что с формой массивов что-то не так, хотя мне нужен совет о том, как двигаться дальше с этим.