当前位置: 首页 > 知识库问答 >
问题:

如何找到第一个非零值在每一列的Numpy数组?

蒋健
2023-03-14

假设我有一个如下形式的numpy数组:

arr=numpy.array([[1,1,0],[1,1,0],[0,0,1],[0,0,0]])

我想找到第一个索引的索引(对于每一列),其中的值是非零的。

因此,在本例中,我希望返回以下内容:

[0,0,2]

我该怎么办?

共有2个答案

厍光霁
2023-03-14

下面是一个使用numpy的替代方法。argwhere返回数组中非零元素的索引:

array = np.array([0,0,0,1,2,3,0,0])

nonzero_indx = np.argwhere(array).squeeze()
start, end = (nonzero_indx[0], nonzero_indx[-1])
print(array[start], array[end])

给予:

1 3
解晟
2023-03-14

使用np。argmax沿非零掩码上的该轴(此处列的第零轴)获取第一个匹配的索引(真值)-

(arr!=0).argmax(axis=0)

扩展到覆盖通用轴说明符,对于在元素的轴上没有非零的情况,我们会有这样的实现-

def first_nonzero(arr, axis, invalid_val=-1):
    mask = arr!=0
    return np.where(mask.any(axis=axis), mask.argmax(axis=axis), invalid_val)

请注意,由于所有False值上的argmax()返回0,因此如果所需的无效值0,我们将直接使用掩码获得最终输出。argmax(轴=轴)

样本运行-

In [296]: arr    # Different from given sample for variety
Out[296]: 
array([[1, 0, 0],
       [1, 1, 0],
       [0, 1, 0],
       [0, 0, 0]])

In [297]: first_nonzero(arr, axis=0, invalid_val=-1)
Out[297]: array([ 0,  1, -1])

In [298]: first_nonzero(arr, axis=1, invalid_val=-1)
Out[298]: array([ 0,  0,  1, -1])

扩展到涵盖所有比较操作

要查找第一个,只需在函数中使用arr==0作为mask。对于第一个值等于某个值的值val,在此处所有可能的比较情况下使用arr==val,依此类推。

为了找到匹配某个比较标准的最后一个,我们需要沿着该轴翻转,并使用使用artmax的相同想法,然后通过从轴长度偏移来补偿翻转,如下所示-

def last_nonzero(arr, axis, invalid_val=-1):
    mask = arr!=0
    val = arr.shape[axis] - np.flip(mask, axis=axis).argmax(axis=axis) - 1
    return np.where(mask.any(axis=axis), val, invalid_val)

样本运行-

In [320]: arr
Out[320]: 
array([[1, 0, 0],
       [1, 1, 0],
       [0, 1, 0],
       [0, 0, 0]])

In [321]: last_nonzero(arr, axis=0, invalid_val=-1)
Out[321]: array([ 1,  2, -1])

In [322]: last_nonzero(arr, axis=1, invalid_val=-1)
Out[322]: array([ 0,  1,  1, -1])

同样,这里所有可能的比较的情况都可以通过使用相应的比较器来获取掩码,然后在列出的函数中使用。

 类似资料:
  • 问题内容: 假设我有以下形式的numpy数组: 我想找到第一个索引(对于每一列)的索引,其中值非零。 因此,在这种情况下,我希望返回以下内容: 我该怎么办? 问题答案: 首次出现的指标 使用沿轴(零轴这里列)非零的面具拿到第一的指标(真实值) 扩展到涵盖通用轴说明符,并且在沿着该轴找不到元素的非零的情况下,我们将有一个类似的实现- 请注意,由于所有值都会返回,因此如果需要的话,我们将直接使用生成最

  • 问题内容: 假设我们有一个1d的numpy数组,其中填充了一些值。假设其中一些是。 有什么方法可以利用数组的功能,用找到的最后一个非零值填充所有值? 例如: 一种方法是使用以下功能: 但是,这是使用原始的python循环,而不是利用and功能。 如果我们知道可能有相当数量的连续零,则可以使用基于的东西。问题在于连续零的数量可能很大… 有任何想法吗?还是我们应该直接去? 免责声明: 我会说很久以前,

  • 问题内容: 我试图获取许多列中的第一个非空值。我知道我可以使用每列的子查询来完成此操作。以性能的名义(在这种情况下确实很重要),我想一次完成。 以以下示例数据为例: 我的梦想查询将在每个数据列中找到第一个非null值,并按排序。 例如,选择第一三列的神奇骨料时,排序由所述下降。 或升序排序时: 有人知道解决方案吗? 问题答案: 可以与一起使用。是必需的,因为SQL Server首先对null进行排

  • 问题内容: 如果我在Pandas中有一个DataFrame,看起来像这样: 如何从每一行中获取第一个非空值?例如,上面我想得到:(或等效的Series)。 问题答案: 这是一种非常麻烦的方法,首先用于获取有效列,将返回的序列转换为数据框,以便我们可以逐行调用并将其索引回原始df: 编辑 稍微干净一点的方法:

  • 问题内容: 我有按日期索引的熊猫。有许多列,但仅在部分时间序列中填充了许多列。我想找到非值第一个和最后一个值的位置,以便提取日期并查看特定列的时间序列有多长时间。 有人能指出我正确的方向,如何去做这样的事情吗?提前致谢。 问题答案: @ behzad.nouri的解决方案完美工作,返回第一个和最后不使用Series.first_valid_index和Series.last_valid_index

  • 问题内容: 我有一个示例数据框显示如下。对于每一行,我想先检查c1,如果它不为null,则检查c2。通过这种方式,找到第一个非空列并将该值存储到列结果中。 我现在正在使用这种方式。但是我想知道是否有更好的方法。(列名没有任何模式,这只是示例) 当有很多列时,此方法看起来不好。 问题答案: 首先使用回填s,然后通过以下方式选择第一列: 要么: 性能 :