Python 如何增量更新数组
假设有3个随机数组:Python 如何增量更新数组,python,numpy,vectorization,Python,Numpy,Vectorization,假设有3个随机数组: A = np.random.rand( 100 ) B = np.random.rand( 100 ) C = np.random.choice( 100, size=100 ) 我想做的是如下所示: V = np.zeros( 100 ) while True: v = V.copy() V = A * ( B + V[ C ] ) if np.abs( V - v ).max() < 1e-9: break V = n
A = np.random.rand( 100 )
B = np.random.rand( 100 )
C = np.random.choice( 100, size=100 )
我想做的是如下所示:
V = np.zeros( 100 )
while True:
v = V.copy()
V = A * ( B + V[ C ] )
if np.abs( V - v ).max() < 1e-9:
break
V = np.zeros( 100 )
while True:
v = V.copy()
for index in range( len( V ) ):
V[index] = A[index] * ( B[index] + V[ C[index] ] )
if np.abs( V - v ).max() < 1e-9:
break
V=np.零(100)
尽管如此:
v=v.copy()
V=A*(B+V[C])
如果np.abs(V-V).max()<1e-9:
打破
问题是,在while循环的每次迭代中,V的每个组件都没有更新到位
例如,当计算V[10]时,它可能需要V[5]的值,但在当时,V[5]是在上一次迭代中生成的旧值,而不是在本次迭代中生成的最新值
这会导致更多的循环,有时甚至不可行
更准确地说,我试图实现的效果如下:
V = np.zeros( 100 )
while True:
v = V.copy()
V = A * ( B + V[ C ] )
if np.abs( V - v ).max() < 1e-9:
break
V = np.zeros( 100 )
while True:
v = V.copy()
for index in range( len( V ) ):
V[index] = A[index] * ( B[index] + V[ C[index] ] )
if np.abs( V - v ).max() < 1e-9:
break
V=np.零(100)
尽管如此:
v=v.copy()
对于范围内的索引(len(V)):
V[index]=A[index]*(B[index]+V[C[index]]
如果np.abs(V-V).max()<1e-9:
打破
但是以矢量化的方式
有什么办法解决这个问题吗?谢谢大家! 你如何决定升级V的顺序。如果V[10]需要V[5]而V[5]需要V[10](这可能发生),您如何决定其中哪一个应获得“旧”值,哪一个应获得“新”值?是的,对于编译后的
numpy
操作(以及一般的Python),RHS在赋值到左侧之前进行完整评估V=fun(V)
已完全缓冲。Python中的逐元素迭代应该会产生您想要的值,但速度要慢得多。或者您可以使用numba
或cython
@Jan Christoph Terasa从第0行编译此操作到第99行。@hpaulj有任何numpy或甚至熊猫的技巧吗?我必须使用cpythoni如果值v[1]依赖于v[0],则没有任何东西可以矢量化。您只能尝试使用上述方法来加速循环,即,将循环移出已解释的Python代码。