文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何获取numpy的第一个非0元素索引

2024-04-02 19:55

关注

我就废话不多说了,

大家还是直接看代码吧~


import numpy as np
arr=np.array([0,0,2,3,0,4])
print((arr!=0).argmax(axis=0))
#2

补充:python获取二维矩阵的每一行的第一个非零元素

直接上代码~


"""
核心函数:
array_1D!=0 :返回一个True/False序列
array.argmax(axis=0):返回沿axis轴的最大元素的索引,当存在多个相等的最大值时,返回第一个最大值的索引
"""
import numpy as np
 
array_1D = np.array([0,1,0,-1,0])
array_2D = np.array(
    [[0, 1, 0, -1, 0],
     [0, 0, -1, 0, 1],
     [0, 1, -1, 0, 1],
     [4, 0, -1, 0, 1],
     [7, 16, -1, 0, 1]])
 
 
def get_first_non_zero_1D(array_1D):
    first_non_zero = array_1D[(array_1D!=0).argmax(axis=0)]
    return first_non_zero
 
"""
备注:以下三个函数完全等价,个人比较喜欢最后一个 get_first_non_zeros_2D_2,因为看着比较舒服,也可以方便地扩展到更多维度。
"""
 
def get_first_non_zeros_2D(array_2D):
    first_non_zeros = np.array([get_first_non_zero_1D(array_2D[i]) for i in range(array_2D.shape[0])])
    return first_non_zeros
 
def get_first_non_zeros_2D_1(array_2D):
    first_non_zeros = []
    for i in range(array_2D.shape[0]):
        arr = array_2D[i,:]
        first_non_zero = arr[(arr!=0).argmax(axis=0)]
        first_non_zeros.append(first_non_zero)
    return np.array(first_non_zeros)
 
def get_first_non_zeros_2D_2(array_2D):
    none_zero_index = (array_2D!=0).argmax(axis=1)
    # first_non_zeros = np.array([array_2D[i,none_zero_index[i]] for i in range(array_2D.shape[0])])
    first_non_zeros = array_2D[range(array_2D.shape[0]),none_zero_index]
    return first_non_zeros
 
b = get_first_non_zeros_2D(array_2D)
c = get_first_non_zeros_2D_1(array_2D)
d = get_first_non_zeros_2D_2(array_2D)
print(b)
print(c)
print(d)
"""
打印结果:
[ 1 -1  1  4  7]
[ 1 -1  1  4  7]
[ 1 -1  1  4  7]
"""

补充:[Python] np.nonzero(ndarray) 返回数组中不为0的元素的索引

语法:

函数返回值为tuple元组类型,tuple内的元素数目与ndarray维度相同。


np.nonzero(ndarray)

先强调一点,数组的索引是从0开始。

示例:


# 1维数组
a = [0,2,3]
b = np.nonzero(a)
print(b)
# (array([1, 2], dtype=int64),)
# 说明:索引1和索引2的位置上元素的值非零。

# 2维数组
a = np.array([[0,0,3],[0,0,0],[0,0,9]])
b = np.nonzero(a)
print(b)
# (array([0, 2], dtype=int64), array([2, 2], dtype=int64))
# 说明:
# tuple的每一个元素,从一个维度来确定非零元素的位置。所以对于二维数组,tuple就有两个元素。
# tuple的元素的内容是该维度不为0的元素的位置,排列顺序是数组遍历的顺序。
# 比如确定第一个非零元素的位置:先找tuple内的第一个元素  array([0, 2], dtype=int64)的第一个元素,为0,说明第一个非零元素在第一行;
# 之后tuple内的第二个元素 array([2, 2], dtype=int64)的第一个元素,为2,说明第一个非零元素在第三列。

# 3维数组
a = np.array([[[0,1],[1,0]],[[0,1],[1,0]],[[0,0],[1,0]]])
print(a)
# [[[0 1]
#   [1 0]]
# 
#  [[0 1]
#   [1 0]]
# 
#  [[0 0]
#   [1 0]]]
b = np.nonzero(a)
print(b)
# (array([0, 0, 1, 1, 2], dtype=int64), array([0, 1, 0, 1, 1], dtype=int64), array([1, 0, 1, 0, 0], dtype=int64))
# 说明:由于a是3维数组,因此,索引值数组有3个一维数组,分别代表层、行、列。
# 查找原理和二维数组一致,不再赘述。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯