Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python、numpy和数组-我的函数中的数组乘法/除法_Python_Arrays_Numpy - Fatal编程技术网

Python、numpy和数组-我的函数中的数组乘法/除法

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

我编辑这篇文章是为了让事情更简单,但原文如下

我基本上想对一个数组做一些数学计算,这个数组的列数相同,但一系列输入的行数不同。因此,使用列的输入数组(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)
我知道你可以广播标量,但我想做的是有一个函数,让我广播一个输入数组

为完整起见,在此处发布原始帖子:

所以我试图改进我现有的功能,实现岩石中矿物质混合物的混合。现在,我一直在为一个由组分和矿物相组成的系统写这篇文章。这是我粘贴的代码(非常糟糕):

我一直在努力改进这一点,并根据已知的岩石成分、孔隙度和含水饱和度,对真实岩石的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 ]))