App下載

如何獲取numpy的第一個(gè)非0元素索引?

玉面郎君 2021-08-13 14:28:37 瀏覽數(shù) (5641)
反饋

numpy的使用場景之一就是獲取二維矩陣的每一行的第一個(gè)非零元素,這樣的場景numpy也是有提供一個(gè)方法來供用戶使用的,接下來我們就來看看如何獲取numpy的第一個(gè)非0元素索引吧。

大家還是直接看代碼吧~

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

補(bǔ)充:python獲取二維矩陣的每一行的第一個(gè)非零元素

直接上代碼~

"""
核心函數(shù):
array_1D!=0 :返回一個(gè)True/False序列
array.argmax(axis=0):返回沿axis軸的最大元素的索引,當(dāng)存在多個(gè)相等的最大值時(shí),返回第一個(gè)最大值的索引
"""
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
 
"""
備注:以下三個(gè)函數(shù)完全等價(jià),個(gè)人比較喜歡最后一個(gè) get_first_non_zeros_2D_2,因?yàn)榭粗容^舒服,也可以方便地?cái)U(kuò)展到更多維度。
"""
 
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)
"""
打印結(jié)果:
[ 1 -1  1  4  7]
[ 1 -1  1  4  7]
[ 1 -1  1  4  7]
"""

補(bǔ)充:[Python] np.nonzero(ndarray) 返回?cái)?shù)組中不為0的元素的索引

語法:

函數(shù)返回值為tuple元組類型,tuple內(nèi)的元素?cái)?shù)目與ndarray維度相同。

np.nonzero(ndarray)

先強(qiáng)調(diào)一點(diǎn),數(shù)組的索引是從0開始。

示例:

# 1維數(shù)組
a = [0,2,3]
b = np.nonzero(a)
print(b)
# (array([1, 2], dtype=int64),)
# 說明:索引1和索引2的位置上元素的值非零。

# 2維數(shù)組
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的每一個(gè)元素,從一個(gè)維度來確定非零元素的位置。所以對于二維數(shù)組,tuple就有兩個(gè)元素。
# tuple的元素的內(nèi)容是該維度不為0的元素的位置,排列順序是數(shù)組遍歷的順序。
# 比如確定第一個(gè)非零元素的位置:先找tuple內(nèi)的第一個(gè)元素  array([0, 2], dtype=int64)的第一個(gè)元素,為0,說明第一個(gè)非零元素在第一行;
# 之后tuple內(nèi)的第二個(gè)元素 array([2, 2], dtype=int64)的第一個(gè)元素,為2,說明第一個(gè)非零元素在第三列。

# 3維數(shù)組
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維數(shù)組,因此,索引值數(shù)組有3個(gè)一維數(shù)組,分別代表層、行、列。
# 查找原理和二維數(shù)組一致,不再贅述。

以上就是如何獲取numpy的第一個(gè)非0元素索引的全部內(nèi)容,希望能給大家一個(gè)參考,也希望大家多多支持W3Cschool。



0 人點(diǎn)贊