基于python中另一个数组的条目计算数组中的新条目

基于python中另一个数组的条目计算数组中的新条目,python,arrays,loops,Python,Arrays,Loops,我有一个问题是如何“调用”数组中的特定单元格,同时在另一个数组上循环。 假设有一个数组a: a = [[a1 a2 a3],[b1 b2 b3]] 和数组b: b = [[c1 c2] , [d1 d2]] 现在,我想使用数组a中的信息重新计算数组b中的值。具体来说,数组b的每个值都必须通过与数组a中给定边界之间的高斯函数的积分相乘来重新计算。但是为了简单起见,让我们忘记积分,并假设有必要进行以下形式的简单计算: c1 = c1 * (a2-a1) ; c2 = c2

我有一个问题是如何“调用”数组中的特定单元格,同时在另一个数组上循环。 假设有一个数组a:

    a = [[a1 a2 a3],[b1 b2 b3]]
和数组b:

    b = [[c1 c2] , [d1 d2]]
现在,我想使用数组a中的信息重新计算数组b中的值。具体来说,数组b的每个值都必须通过与数组a中给定边界之间的高斯函数的积分相乘来重新计算。但是为了简单起见,让我们忘记积分,并假设有必要进行以下形式的简单计算:

    c1 = c1 * (a2-a1) ; c2 = c2 * (a3 - a2) and so on,
对于索引,它可能看起来像:

    b[i,j] = b[i,j] * (a[i, j+1] - a[i,j])
有人能告诉我如何解决这个问题吗? 非常感谢并致以最良好的问候, Marc

您可以在嵌套列表中使用函数:

>>> [[k*(v[1]-v[0]) for k,v in zip(v,zip(s,s[1:]))] for s,v in zip(a,b)]
zip(s,s[1:])
将为您提供所需的元素对,例如:

>>> s =[4, 5, 6]
>>> zip(s,s[1:])
[(4, 5), (5, 6)]
演示:

>>> b =[[7, 8], [6, 0]]
>>> a = [[1,5,3],[4 ,0 ,6]]
>>> [[k*(v[1]-v[0]) for k,v in zip(v,zip(s,s[1:]))] for s,v in zip(a,b)]
[[28, -16], [-24, 0]]

您也可以使用numpy非常干净地执行此操作:

import numpy as np
a, b = np.array(a), np.array(b)
np.diff(a) * b

首先,我将您的a表拆分为一个下限表和一个上限表,以处理对齐的表并提高可读性:

lowerBounds = a[...,:-1]
upperBounds = a[...,1:]
定义您提供的高斯函数:

def f(x, gs_wdth = 1., mean=0.):
    return 1./numpy.sqrt(2*numpy.pi)*gs_wdth * numpy.exp(-(x-mean)**2/(2*gs_wdth**2))
然后,使用
nditer
(请参阅)高效地迭代数组:

it = numpy.nditer([b, lowerBounds, upperBounds],
                   op_flags=[['readwrite'], ['readonly'], ['readonly']])
for _b, _lb, _ub in it:
    multiplier = scipy.integrate.quad(f, _lb, _ub)[0]
    _b[...] *= multiplier
print b

这就完成了你的职位所要求的工作,并且在计算上应该是高效的。请注意,修改后的“就地”中的
b
:原始值丢失,但在计算过程中没有内存超调。

您的意思是
c[i,j]=b[i,j]*(a[i,j+1]-a[i,j])
a1
a2
a3
中的元素是
a[0][0]、
a[0][1]、
a[0][2]/code>,而
a
中的
b1
b2
b3
元素是
a[1][0]
a[1][1]
a[1][2]
。在
a
数组中有名为
b
的元素,这令人困惑。无论如何,考虑到这一点,您应该能够找出
b
数组中元素的索引。我想他想要
[[v[idx]*(j-I)表示idx,(I,j)在枚举中(zip(s,s[1:])],在zip(a,b)中表示s,v)]
@Alex是的,与您的提醒同时编辑!;)谢谢你们两位!我试着用X=[[k*(scipy.integrate.quad(f,v[1],v[0])表示k,v在zip中(v,zip(s,s[1:]))]表示s,v在zip(a,b)]。我确信它是有效的,但我需要对函数f进行特殊处理。我定义了f=lambda x:1/np.sqrt(2*pi)*gs_wdth)*np.exp(-(x-平均值)**2/(2*gs_wdth**2))高斯宽度对于上述每次计算都是相同的。数组a/b中每个“行”的“平均”值都会发生变化。对于b=[[7,8],…];a=[[1,5,3],…]例如,对于b=[…,[6,0],,gs_-wdth是2;a=[…,[4,0,6]]第四个字母是例如4。gs_wdth列在数组中,例如wdt=[2,4]。可以包括这一点吗?我尝试了您的版本,行为:multiplier=scipy.integrate.quad(f,_lb,_ub),但不幸的是,他遇到了一个问题,并发出了以下呼吁:ValueError:包含多个元素的数组的真值不明确。使用a.any()或a.all(),我必须在哪里填写any()或all(),或者是否解决了这个问题?问题是scipy.integrate.quad没有矢量化,需要浮点参数作为下限和上限。解决方案是通过移除外部_循环标志,一次提供一个迭代数组元素。为了反映这一点,我改变了答案。不过,这在计算效率上应该要低一些。