我就废话不多说了,
大家还是直接看代码吧~
1
2
3
4
|
import numpy as np arr = np.array([ 0 , 0 , 2 , 3 , 0 , 4 ]) print ((arr! = 0 ).argmax(axis = 0 )) #2 |
补充:python获取二维矩阵的每一行的第一个非零元素
直接上代码~
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
""" 核心函数: 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维度相同。
1
|
np.nonzero(ndarray) |
先强调一点,数组的索引是从0开始。
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
# 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个一维数组,分别代表层、行、列。 # 查找原理和二维数组一致,不再赘述。 |
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/dlhlSC/article/details/88080283