使用视图进行 NumPy 广播
Using views for NumPy broadcasting
假设我有一个 2D np.array X
,我需要在一些中间计算中使用 X[:, None, :]
;例如
np.sum(X[:, None, :] == Y[None, :, :], axis=2)
其中 Y
也是 2D np.array。
此操作是否显式复制 X
和 Y
的内存以创建 X[:, None, :]
和 Y[:, None, :]
?如果是这样,有没有办法通过在 NumPy 中使用视图来避免这种复制?
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
中没有计算非归一化汉明距离的选项,因此我们必须撤消归一化。
假设我有一个 2D np.array X
,我需要在一些中间计算中使用 X[:, None, :]
;例如
np.sum(X[:, None, :] == Y[None, :, :], axis=2)
其中 Y
也是 2D np.array。
此操作是否显式复制 X
和 Y
的内存以创建 X[:, None, :]
和 Y[:, None, :]
?如果是这样,有没有办法通过在 NumPy 中使用视图来避免这种复制?
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
中没有计算非归一化汉明距离的选项,因此我们必须撤消归一化。