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
很大,则可能没有好处。