Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何增量更新数组_Python_Numpy_Vectorization - Fatal编程技术网

Python 如何增量更新数组

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

假设有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 = 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代码。