我有一个问题,基于如何“调用”数组中的特定单元格,同时循环遍历另一个数组。 假设有一个数组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])
有谁能告诉我如何解决这个问题? 非常感谢和最诚挚的问候, 马克
答案 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
:原始值会丢失,但在计算过程中没有内存过冲。