NumPy中的矢量化操作

ast*_*nlu 2 python numpy vectorization

有没有一种通用的方法来在NumPy中对这些操作进行矢量化?

In [2]: N = 8

In [3]: ll = np.arange(8)

In [4]: arr = np.zeros(ll.shape + (2, 2))

In [5]: ll.shape
Out[5]: (8,)

In [6]: arr.shape
Out[6]: (8, 2, 2)

In [7]: for ii in range(N):
   ...:     arr[ii, :, :] = np.array(...)  # 2 x 2 array function of ll[ii]
Run Code Online (Sandbox Code Playgroud)

如果该函数是对ll的线性运算那么这将是微不足道的,但是在一般情况下有没有办法做到这一点?举个例子:

In [8]: for ii in range(N):
   ...:     arr[ii, :, :] = np.array([
   ...:         [np.cos(ll[ii]) - 1, 0],
   ...:         [np.sin(ll[ii]), np.cos(ll[ii]) ** 2]
   ...:     ])
Run Code Online (Sandbox Code Playgroud)

Jai*_*ime 5

组装arr阵列的正确方法如下:

arr[:, 0, 0] = np.cos(ll) - 1
arr[:, 0, 1] = 0
arr[:, 1, 0] = np.sin(ll)
arr[:, 1, 1] = np.cos(ll) ** 2
Run Code Online (Sandbox Code Playgroud)

你绝对不应该调用np.array将要存储在一个已经存在的数组中的数组列表:这是一个浪费的中间数组创建,这是一个不好的做法,我怀疑它增加了代码的清晰度.内存/性能意识的开发人员可能会做类似的事情:

np.cos(ll, out=arr[:, 0, 0])
arr[:, 1, 1] = arr[:, 0, 0]
arr[:, 0, 0] -= 1
arr[:, 0, 1] = 0
np.sin(ll, out=arr[:, 1, 0])
arr[:, 1, 1] *= arr[:, 1, 1]
Run Code Online (Sandbox Code Playgroud)

但这往往属于不成熟的优化类别.

你也应该真的不能ll用作变量名......