正确的python方式:在for循环中处理原始

时间:2017-03-13 12:25:29

标签: python numpy vectorization

我有一个ndarray'n_data'浮点形状(N,3)。我想itterate并对'n_data'进行更改(不是副本)。我有以下代码巫婆工作,但感觉非常脏:

    i = 0
    for point in n_data:
        point -= center

        r = np.linalg.norm(point)
        n_data[i] = point * (r ** gamma / r)

        i += 1

我尝试使用np.nditer,但是对于每次迭代,它将得到一个数字,而不是如上所述的具有形状(3,)的ndarray。

        for point in np.nditer(n_data, op_flags=['readwrite']):

        point -= center

        r = np.linalg.norm(point)
        point = point * (r ** gamma / r)

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

转换为 NumPy术语的一个矢量化版本仍然看起来与原始代码足够接近,可以使用NumPy broadcasting并使用可选参数axis参数使用np.linalg.norm,就像这样 -

shifted = n_data - center
R = np.linalg.norm(shifted, axis=1, keepdims=1)
n_data = shifted * (R ** gamma / R)

希望这感觉不那么