首页 > 解决方案 > Numpy 迭代数组操作

问题描述

我已经开始通过使用 numpy 数组操作来删除越来越多的 for 循环。但是,我坚持以下情况。欢迎任何帮助。

我从长度为 L 的数组和另一个长度为 L 的数组中的单个已知值 ( 0.55)开始。我想使用交叉乘法填充第一个数组中的剩余值。AB

这给了我想要的输出:

def cross_mult(B, starting_A = 0.55):
    A= np.zeros(B.shape)
    A[0] = starting_A   
    for i in range(B.shape[0])[1:]:
        A[i] = A[i-1] * B[i] / B[i-1]
    return A

没有 for 循环的尝试失败:

def cross_mult(B, starting_A = 0.55):
    A= np.zeros(B.shape)
    A[0] = starting_A 
    A[1:] = A[:-1] * B[1:] / B[:-1]
    return A

我得到:

array([0.55      , 0.60401715, 0.       ])

而不是其中包含三个值的完全填充的数组。

标签: pythonarrayspython-3.xnumpyfor-loop

解决方案


向量化这个函数的问题是每个索引的计算实际上确实依赖于它之前的索引,所以计算必须按顺序进行。

据我所知,在这种情况下你被困在循环中:)

如果你真的想避免显式使用循环,你可以使用accumulate

def cross_mult(B, starting_A = 0.55):
    A= np.zeros(B.shape)
    A[0] = starting_A 
    A[1:] = B[1:] / B[:-1]
    return np.multiply.accumulate(A)

推荐阅读