我有一个像这样的numpy矩阵:
array([[2, 1, 23, 32],
[34, 3, 3, 0],
[3, 33, 0, 0],
[32, 0, 0, 0]], dtype=int32)
现在我想将所有数字移到右边并将零交换到左边,如下所示:
array([[2, 1, 23, 32],
[0, 34, 3, 3],
[0, 0, 3, 33],
[0, 0, 0, 32]], dtype=int32)
是否有一种简短的pythonic方式来实现这一点,也许是使用来自numpy,pandas或scikit-learn的api方法?
6 回答
这是一个带有masking的矢量化方法 -
样品运行 -
一个更通用的样本运行 -
Runtime test
适用于通用案例的方法 -
计时 -
熊猫方法:
这使用
apply
所以我们可以在每一行上调用np.roll
每行的零数你也可以使用
numpy.argsort
和advanced indexing:基于非numpy的python的琐碎尝试 -
您还可以在numpy.ma.sort()的帮助下对屏蔽数组执行排序,该排列沿着最后一个轴对该数组进行排序,如图所示:
axis=-1
:现在
a
成为:唯一的缺点是,它不如上面提到的一些方法快,但仍然是一个简短的单线程 .
基于行滚动的解决方案,本着
@EDChum's
pandas版本的精神:np.count_nonzero
是一种快速编译的查找非零数的方法 .np.where
使用它来查找其返回大小 .但是看看
np.roll
代码,我认为这个任务过于复杂,因为它可以用于多个轴 .这看起来更麻烦,但我怀疑它速度快,如果不快于
roll
:roll
解决方案要求原始值为0,而不是零散0 .