【问题标题】:broadcast / extend boolean array along axis in python在python中沿轴广播/扩展布尔数组
【发布时间】:2016-10-27 08:08:31
【问题描述】:

我正在尝试沿向量广播一个布尔一维数组以隔离某些操作。

例如,如果我的布尔数组是:

b = array([True False False True])

np.shape(b) = (4,)

我想进行逐行比较的矩阵是这种形式:

A = array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0], [10.0, 11.0, 12.0]])

np.shape(A) = (4, 3)

我想要的最终结果是:

C = b * A (row-wise comparison) 

C = array([[1.0, 2.0, 3.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [10.0, 11.0, 12.0]])

我意识到这可以通过切片来完成,但我需要使用逻辑数组来提高速度。有没有办法“扩展”布尔向量以便它在行上工作?

这个想法是能够在一行中计算一个函数,以便

D = b * A * (some operation done over all vectors) + ~b * A * (some different operation done over all vectors)

谢谢!

【问题讨论】:

  • 您确定不要np.where(b, (some operation), (some other operation))
  • 我不确定它在这种情况下是否有效,因为我需要做的操作是基于向量的索引(即,如果向量在此索引处,请执行此操作)。我认为作为一个完全向量化的操作,最快的方法是使用逻辑数组,而不是切片。
  • 查看接受的答案,您似乎确实想要np.where(b[:,None], A*..., A*...)。这应该至少和你上面的乘法一样快(如果不是,那么你应该针对 numpy 提交一个错误来做到这一点!)

标签: python numpy logical-operators array-broadcasting


【解决方案1】:

b 扩展到2D,将第二个轴保持为单维(与length = 1 的维度)并与A 相乘。因此,在后台 b 将被广播为与 A 相同的形状,并且将执行逐元素乘法。

因此,矢量化解决方案将是 -

A*b[:,None]

【讨论】:

    猜你喜欢
    • 2011-01-22
    • 2017-01-14
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 2018-12-13
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多