布尔条件后的 Numpy ndarray 广播
Numpy ndarray broadcasting following a boolean condition
我想知道是否有一种方法可以通过避免使用 for 循环来利用 python numpy 数组广播来减少计算时间。这是以下最小示例:
import numpy as np
# parameters
n_t = 256
G = 0.5
k_n = 10
# typical data
tau = np.linspace(0,2*np.pi,256)
x_t = np.sin(tau).reshape((n_t,1))
delta = np.maximum(0,(x_t-G))
f_dot = np.zeros((n_t,1))
for i in range(0,n_t,1):
# boolean condition
if delta[i,0] > 0:
f_dot[i,0] = k_n
如有任何建议,我们将不胜感激。谢谢
您可以使用 np.where
根据条件的结果从 k_n
或 f_dot
中分配值:
f_dot = np.where(delta > 0, k_n, f_dot)
numpy.where
是 @yatu 指出的一个好方法。为了完整起见,逻辑屏蔽也是一种选择。 In fact, there are many ways to slice an numpy.array
object!.
mask = delta>0
f_dot[mask] = k_n
请注意,如果面具是一次性的,这也可以减少到一行:f_dot[delta>0] = k_n
。
我想知道是否有一种方法可以通过避免使用 for 循环来利用 python numpy 数组广播来减少计算时间。这是以下最小示例:
import numpy as np
# parameters
n_t = 256
G = 0.5
k_n = 10
# typical data
tau = np.linspace(0,2*np.pi,256)
x_t = np.sin(tau).reshape((n_t,1))
delta = np.maximum(0,(x_t-G))
f_dot = np.zeros((n_t,1))
for i in range(0,n_t,1):
# boolean condition
if delta[i,0] > 0:
f_dot[i,0] = k_n
如有任何建议,我们将不胜感激。谢谢
您可以使用 np.where
根据条件的结果从 k_n
或 f_dot
中分配值:
f_dot = np.where(delta > 0, k_n, f_dot)
numpy.where
是 @yatu 指出的一个好方法。为了完整起见,逻辑屏蔽也是一种选择。 In fact, there are many ways to slice an numpy.array
object!.
mask = delta>0
f_dot[mask] = k_n
请注意,如果面具是一次性的,这也可以减少到一行:f_dot[delta>0] = k_n
。