我有一个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)
提前感谢您的帮助!
答案 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)
希望这感觉不那么脏!