使用NumPy广播的视图

时间:2018-01-16 20:43:39

标签: python numpy numpy-broadcasting

假设我有一个2D np.array X,我需要在一些中间计算中使用X[:, None, :];例如 np.sum(X[:, None, :] == Y[None, :, :], axis=2)其中Y也是2D np.array。

此操作是否明确复制XY的内存以创建X[:, None, :]Y[:, None, :]?如果是这样,有没有办法通过使用NumPy中的视图来避免这种复制?

1 个答案:

答案 0 :(得分:3)

X[:, None, :]Y[None, :, :]已经是观看次数。这两个操作都是NumPy basic slicing,它总是生成一个视图。

X[:, None, :] == Y[None, :, :]将成为一个更大的内存问题,因为它会创建一个非常大的布尔数组。您可以通过在'hamming'模式下scipy.spatial.distance.cdist重写您的计算来避免这种情况:

In [10]: x
Out[10]: 
array([[3, 0, 2, 2, 3],
       [3, 2, 1, 3, 2],
       [2, 2, 1, 1, 1]])
In [11]: y
Out[11]: 
array([[0, 0, 1, 2, 3],
       [2, 0, 0, 1, 1],
       [2, 0, 2, 3, 3],
       [2, 1, 1, 2, 1]])
In [12]: numpy.sum(x[:, None, :] == y[None, :, :], axis=2)
Out[12]: 
array([[3, 1, 3, 1],
       [1, 0, 1, 1],
       [1, 3, 1, 3]])
In [13]: 5 - 5*cdist(x, y, 'hamming') # 5 for the row length of x and y
Out[13]: 
array([[ 3.,  1.,  3.,  1.],
       [ 1.,  0.,  1.,  1.],
       [ 1.,  3.,  1.,  3.]])

scipy.spatial.distance中无法计算非标准化的汉明距离,因此我们必须撤消标准化。