【问题标题】:Using views for NumPy broadcasting使用视图进行 NumPy 广播
【发布时间】:2018-01-17 05:23:28
【问题描述】:

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

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

【问题讨论】:

    标签: python numpy array-broadcasting


    【解决方案1】:

    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 中没有计算非归一化汉明距离的选项,因此我们必须撤消归一化。

    【讨论】:

    • 啊,这很有帮助。谢谢!但是,我不确定如何使用scipy.spatial.distance.pdist 来计算X 的每一行与Y 的每一行之间的汉明距离,而不是X 本身的行之间的距离?
    • 当然,我可以将Y附加到X,然后调用pdist,但这会非常浪费,因为我只需要1/4的结果。
    • @Hilbert:哎呀,我的意思是 cdist。我忘了哪一个是二矩阵函数。 (即使 cdist 不是一个东西,pdist 可能仍然比生成巨大的布尔数组更有效。)
    • 啊,太好了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多