Python 如何将每个numpy列中的所有非零元素指定给数组中的一个值,该值的大小与列数相同?

Python 如何将每个numpy列中的所有非零元素指定给数组中的一个值,该值的大小与列数相同?,python,arrays,numpy,Python,Arrays,Numpy,所以这有点过分了。但我想做的是: b = np.array([7,8,2,3]) a = np.array([[1, 1, 0, 1], [0, 0, 1, 1], [0, 1, 1, 0]]) *** The Magic Happens *** array([[7, 8, 0, 3], [0, 0, 2, 3], [0, 8, 2, 0]]) 我几乎不认为有更快/更整洁的答案。为别人写作,让他们觉得它很

所以这有点过分了。但我想做的是:

b = np.array([7,8,2,3])

a = np.array([[1, 1, 0, 1],
              [0, 0, 1, 1],
              [0, 1, 1, 0]])

*** The Magic Happens ***

array([[7, 8, 0, 3],
       [0, 0, 2, 3],
       [0, 8, 2, 0]])

我几乎不认为有更快/更整洁的答案。为别人写作,让他们觉得它很有帮助。正如注释中提到的@Mark,您可以通过
a>0
找到非零元素,并将其乘以
b
将通过重复行和按元素相乘将
b
广播到
a
的形状:

output = (a > 0) * b
另一种方法是:

a[a>0] = np.tile(b,(a.shape[0],1))[a>0]

a
总是一和零吗?@MarkMeyer我觉得这不重要。但是你可以假设为muchWell,如果它总是1和0,你可以使用
a*b
,它将(神奇地)广播。事实上,即使不是:
(a>0)*b
也很有效。@MarkMeyer好主意!我将把这个问题留待讨论,以防有更一般的方法。但是谢谢你,看看哪一个更快会很有趣:
(a>0)*b
a.astype(bool)*b
@Guimoute我希望它们大致相同。我不明白为什么一个会比另一个有优势
a.astype()
创建一个副本,如果
a
很大,则可能没有好处。