【问题标题】:find nonzero indices as an array查找非零索引作为数组
【发布时间】:2018-01-17 21:41:20
【问题描述】:

我知道numpy.where 给出了条件适用的数组坐标的元组。但是如果我想要一个数组呢? 假设以下二维数组:

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

现在我想要的只是第一次出现零,但对于每一行,即使它不存在。 Java 中的 indexOf() 之类的东西。所以输出看起来像:

array([-1,2,2,1,0])

我需要切割一个 ndarray 的片段,减少维度而不是拥有一个元组并尝试重新生成丢失的行会容易得多。

【问题讨论】:

  • stackoverflow.com/questions/27175400/…我希望这会有所帮助
  • 所呈现的矩阵与样本输出之间是否存在关系?
  • @EugeneSh。是的,但是 OP 在行和列之间混淆了。
  • 另外,示例中应该有逗号才能复制 Python 语法
  • @AntonvBR。是为了转置。第一个 column 没有零,所以 -1。接下来的两列在第 2 行中的第一个为零,依此类推。

标签: python numpy


【解决方案1】:

这是一个不那么狡猾的解决方案,但可以说更容易理解。 首先找到所有匹配项,然后使用匹配项的第一个元素创建一个数组,如果 len == 0 则为 -1。

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

matches = [np.where(np.array(i)==0)[0] for i in a.T]
np.array([i[0] if len(i) else -1 for i in matches]) # first occurence, else -1

array([-1,  2,  2,  1,  0])

【讨论】:

    【解决方案2】:

    this 是你要找的吗?

    import numpy as np
    
    a=np.array([[1, 1, 1, 1, 0],
                [1, 1, 1, 0, 0],
                [1, 0, 0, 0, 0],
                [1, 0, 1, 1, 1],
                [1, 0, 0, 1, 0]])
    
    np.argmax(a==0, axis=0) - ~np.any(a==0, axis=0)
    

    输出:

    array([-1,  2,  2,  1,  0], dtype=int64)
    

    这里的想法是np.argmax 找到每列中第一个匹配元素的索引(axis=0 表示 columns,这似乎是您在输出中想要的,但如果您实际上想要,使用axis=1)。因为np.argmax 为根本不匹配的列返回 0,所以我从不包含任何 0 的每一列的结果中减去 1。

    【讨论】:

    • a.argmin(0)-a.all(0) 作为快捷方式。
    猜你喜欢
    • 2020-02-21
    • 1970-01-01
    • 2014-06-03
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    • 2021-04-04
    相关资源
    最近更新 更多