【问题标题】:np.multiply "where" condition is problematic?np.multiply "where" 条件有问题?
【发布时间】:2020-08-23 00:00:42
【问题描述】:

我必须将两个 numpy 数组相乘,逐个元素,并且,我对使用 np.multiply 感兴趣,而不是使用 a * b,因为它的“where”选项,这应该可以帮助我节省一些计算时间。事实上,我只对 a*b 感兴趣,其中第三个数组 c 的值 > 0。

其实a、b、c都只取{0,1}中的值,所以它们都是“int8”数组,维度都>3。

所以我设置 np.multiply(a,b where=c),将 c 更改为数据类型“bool”。该函数有时似乎可以工作,但有时它会在某些条目中产生绝对无意义的数字,例如 123或-42或其他。 试图找出原因,我也有这个输出,带有一些较小的数组:

a,b = np.random.choice(10,size=(4,4)),np.random.choice(10,size=(4,4))

c = np.random.choice(2,size=(4,4)).astype("bool")

a

> array([[9, 6, 5, 0],
       [6, 3, 7, 9],
       [0, 4, 0, 7],
       [1, 9, 1, 9]])

b

> array([[9, 9, 2, 7],
       [8, 6, 2, 4],
       [7, 9, 6, 5],
       [8, 4, 1, 0]])


c

> array([[ True,  True,  True, False],
       [ True,  True,  True, False],
       [ True, False,  True, False],
       [False,  True,  True,  True]])


np.multiply(a,b,where=c)

> array([[81, 54, 10,  1],
       [48, 18, 14,  1],
       [ 0,  1,  0,  1],
       [ 1, 36,  1,  0]])

其中c为“False”,输出不是0而是1。

这个函数有什么问题?

编辑:我指定在我的函数应用程序中,a 和 b 不共享相同的形状,但乘法仍然是可能的,并且在没有 where 选项的情况下返回正确的结果。

【问题讨论】:

  • 在其他 SO 中,我们发现您需要提供 outwhere。当前的np.multiply 文档对此非常清楚;不知道最近有没有改过。

标签: python arrays numpy matrix-multiplication


【解决方案1】:

根据文档,如果whereFalse,则对应的位置将保持未初始化状态。在你的情况下,你可以简单地做:

a*b*c.astype(int)

或者如果你想使用np.multiply,你应该初始化out选项:

np.multiply(a,b,where=c, out=np.zeros_like(a))

输出:

array([[81, 54, 10,  0],
       [48, 18, 14,  0],
       [ 0,  0,  0,  0],
       [ 0, 36,  1,  0]])

【讨论】:

  • 在我的应用程序中,我正在处理具有大量条目的 4d 数组。在一些初步测试中,我发现使用“multiply(a,b where c) 比 abc 更快。感谢您的回答,我正在尝试。
  • 好吧,我发现每次都需要初始化一个 zeros 数组会缩短时间优势。尽管如此,它仍然是相关的,对我来说大约是 15%。我仍然不明白为什么这不能是默认设置,设置“零”是 False。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-17
  • 2021-02-13
  • 1970-01-01
相关资源
最近更新 更多