基于python中另一个数组的条目计算数组中的新条目
我有一个问题是如何“调用”数组中的特定单元格,同时在另一个数组上循环。 假设有一个数组a:基于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 = [[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没有矢量化,需要浮点参数作为下限和上限。解决方案是通过移除外部_循环标志,一次提供一个迭代数组元素。为了反映这一点,我改变了答案。不过,这在计算效率上应该要低一些。