您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“怎么獲取numpy的第一個非0元素索引”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“怎么獲取numpy的第一個非0元素索引”這篇文章吧。
numpy的使用場景之一就是獲取二維矩陣的每一行的第一個非零元素,這樣的場景numpy也是有提供一個方法來供用戶使用的
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個一維數組,分別代表層、行、列。
# 查找原理和二維數組一致,不再贅述。
以上是“怎么獲取numpy的第一個非0元素索引”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。