Python、numpy和数组-我的函数中的数组乘法/除法
我编辑这篇文章是为了让事情更简单,但原文如下 我基本上想对一个数组做一些数学计算,这个数组的列数相同,但一系列输入的行数不同。因此,使用列的输入数组(1行)进行计算,其中计算是按行应用于较大数组的。较大的数组具有与输入相同的列数。列数将根据我所做的计算而变化,但两个输入的列数始终相同;例如,阵列1为(2000L,3L),阵列2为(1L,3L),如果阵列1为(3050L,5L),则阵列2为(1L,5L),依此类推 下面是我目前正在尝试的示例:Python、numpy和数组-我的函数中的数组乘法/除法,python,arrays,numpy,Python,Arrays,Numpy,我编辑这篇文章是为了让事情更简单,但原文如下 我基本上想对一个数组做一些数学计算,这个数组的列数相同,但一系列输入的行数不同。因此,使用列的输入数组(1行)进行计算,其中计算是按行应用于较大数组的。较大的数组具有与输入相同的列数。列数将根据我所做的计算而变化,但两个输入的列数始终相同;例如,阵列1为(2000L,3L),阵列2为(1L,3L),如果阵列1为(3050L,5L),则阵列2为(1L,5L),依此类推 下面是我目前正在尝试的示例: # Make data (for 3 componen
# 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)
我知道你可以广播标量,但我想做的是有一个函数,让我广播一个输入数组
为完整起见,在此处发布原始帖子:
所以我试图改进我现有的功能,实现岩石中矿物质混合物的混合。现在,我一直在为一个由组分和矿物相组成的系统写这篇文章。这是我粘贴的代码(非常糟糕):
我一直在努力改进这一点,并根据已知的岩石成分、孔隙度和含水饱和度,对真实岩石的Reuss平均值进行正演模拟。我的输入是一系列矿物组分,这些矿物组分的总和为1,在深度维度中采样,因此基本上是一个2D数组,包含(nsamples,nPhases)。我不知道如何在1D(nphases)数组中获取矿物属性数组,并对每个样本进行计算。到目前为止,我已经尝试了这个,它输出了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)
我想阵列的形状可能有问题,不过我需要一些关于如何进一步改进的建议 当我运行这两个代码段时,它工作正常。你能再试一次吗?如果仍然不起作用,请给我们您的python和numpy版本
旁注:唯一不起作用的代码是您所说的您使用的代码,因为PHI没有默认值,并且在参数后面有默认值。我将您的问题解释为行数是可变的,因此您的输出数组应该是长度与行数相同的1D数组。你基本上是在每一行
fracs[i]
(3d)和向量1/K
(或1/G
)(3d)之间做一个点积,然后对每一行进行5次求和。这是正确的吗
如果是这样,我认为您编写的代码将在错误的轴上求和。应该是这样的:
def reuss(fracs, K, G): # You want 5 outputs for rK and rG, right?
rK = 1 / np.sum(fracs / K, axis = 1) # I interpret this as what you want.
rG = 1 / np.sum(fracs / G, axis = 1)
return rK, rG
# alternatively you can stack K and G and do it all at once
rK,rG = (1/((fracs[...,np.newaxis]/np.stack((K,G),-1)[np.newaxis,...]).sum(axis=1))).T
无论哪种方式都会返回
>>> reuss(fracs,K,G)
(array([19.88950276, 24.40677966, 32.14285714, 17.64705882, 25.80645161]),
array([14.86486486, 15.10297483, 16.92307692, 14.28571429, 23.8267148 ]))
编辑:这在
K
和G
的定义中没有额外的轴。您可以编写np.array([[K1,K2,K3]])
。我写np.array([K1,K2,K3])
你能把它从岩石物理的背景中分离出来,使它更简单吗?您的投入和预期产出是什么?例如,压裂可以是2x2。你想要的输出可能是一行,利用numpy广播。我希望这更清楚一点?你肯定也可以广播输入数组,我只是不知道你的答案应该是什么样子。这里有一个很好的广播入门:Kr,Gr的预期输出是什么?是的,这里也一样-但我在一台非大学/学校的机器上。这很奇怪,我将把它标记为已回答
>>> reuss(fracs,K,G)
(array([19.88950276, 24.40677966, 32.14285714, 17.64705882, 25.80645161]),
array([14.86486486, 15.10297483, 16.92307692, 14.28571429, 23.8267148 ]))