根据python中另一个数组的条目计算数组中的新条目

时间:2015-03-10 16:11:58

标签: 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 * (a3 - a2) and so on,

带索引可能看起来像:

    b[i,j] = b[i,j] * (a[i, j+1] - a[i,j])

有谁能告诉我如何解决这个问题? 非常感谢和最诚挚的问候, 马克

3 个答案:

答案 0 :(得分:1)

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

>>> [[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]]

答案 1 :(得分:1)

你也可以用numpy干净利落地做到这一点:

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

答案 2 :(得分:0)

首先,我会将一个表拆分为下限和上限之一的表,以便使用对齐的表并提高可读性:

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(请参阅Iterating Over Arrays)有效地迭代数组:

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:原始值会丢失,但在计算过程中没有内存过冲。