Python 在2d numpy数组的每行中查找最小非零值

Python 在2d numpy数组的每行中查找最小非零值,python,arrays,numpy,Python,Arrays,Numpy,我试图在2d numpy数组的每一行中找到最小的非零值,但还没有找到一个优雅的解决方案。我看过一些其他的帖子,但没有一篇能解决完全相同的问题。 或者。 例如,对于给定阵列: x = np.array([[3., 2., 0., 1., 6.], [8., 4., 5., 0., 6.], [0., 7., 2., 5., 0.]]) 答案是: [1., 4., 2.] 我用这种方法解决了这个问题,时间复杂度是o(n^2) 将numpy导入为np x=np.数组([[3,2,0,1,6.],[

我试图在2d numpy数组的每一行中找到最小的非零值,但还没有找到一个优雅的解决方案。我看过一些其他的帖子,但没有一篇能解决完全相同的问题。 或者。
例如,对于给定阵列:

x = np.array([[3., 2., 0., 1., 6.], [8., 4., 5., 0., 6.], [0., 7., 2., 5., 0.]])
答案是:

[1., 4., 2.]

我用这种方法解决了这个问题,时间复杂度是
o(n^2)

将numpy导入为np
x=np.数组([[3,2,0,1,6.],[8,4,5,0,6.],[0,7,2,5,0.]))
对于范围内的i(len(x)):
小=x[i][i]
对于x[i]中的j:

如果(j!=0且j这样做的一种方法是将零重新分配给np.inf,然后每行取min:

np.where(x>0, x, np.inf).min(axis=1)
输出:

array([1., 4., 2.])

蒙版阵列正是为这些目的而设计的。您可以利用阵列中的蒙版零(或您想要的任何其他类型的蒙版),并在蒙版阵列上执行常规阵列上的大部分操作:

import numpy.ma as ma
mx = ma.masked_array(x, mask=x==0)
mx.min(1)
输出:

[1.0 4.0 2.0]

这回答了你的问题吗?有点,但不完全。虽然我已经把它标记为答案。努力是有的,但会非常缓慢。如果你使用向量(数组),尽量避免循环。@Dieter是的,没错。我们的主要逻辑是一样的!但我写了我想到的最简单的方法。你为什么认为你的解决方案是o(n^2)?-这并不是因为你用2来表示循环,它是n^2,这是有意义的。但这是太多的样板代码,我想避免用一种更具python风格的方式来做。另外,当你说复杂性是n^2时,你假设n是什么?是的,那是n^2,我犯了一个错误。我知道这种方式不快,但我认为可能有帮助。这如果你解释了你提供的代码是如何回答这个问题的,那么s将是一个更好的答案。我了解逻辑,但不确定这会有多高效。此外,我必须创建一个新的x副本,以防我不想用inf替换零。@UsmanTariq-在这个矩阵上需要497毫秒x=np.random.randint(低=0,高=5,大小=(10**7,5))…所以我认为它会很好地工作:)np.where有点慢。793毫秒。-ma.masked_阵列是最快的,有121毫秒。很好知道。谢谢分享。谢谢。我不知道你能在numpy做这样的事情。@UsmanTariq不客气。编码快乐!@ScottBoston,你的反应太棒了!!!喜欢它。不知道np能做到这一点,而且是最好的部分是不是
x
仍然完好无损。太好了。正是我要找的。谢谢。
import numpy.ma as ma
mx = ma.masked_array(x, mask=x==0)
mx.min(1)
[1.0 4.0 2.0]