Python学习之numpy中的nonzero()
一、nonzero(a)
nonzero函数是numpy中用于得到数组array中非零元素的位置(数组索引)的函数。它的返回值是一个长度为a.ndim(数组a的轴数)的元组,元组的每个元素都是一个整数数组,其值为非零元素的下标在对应轴上的值。
(1)只有a中非零元素才会有索引值,那些零值元素没有索引值;
(2)返回的索引值数组是一个2维tuple数组,该tuple数组中包含一维的array数组。其中,一维array向量的个数与a的维数是一致的。
(3)索引值数组的每一个array均是从一个维度上来描述其索引值。比如,如果a是一个二维数组,则索引值数组有两个array,第一个array从行维度来描述索引值;第二个array从列维度来描述索引值。
(4)transpose(np.nonzero(x))函数能够描述出每一个非零元素在不同维度的索引值。
(5)通过a[nonzero(a)]得到所有a中的非零值
二、实例
1、一维数组
#a是一位数组
a=[0,2,3]
b=np.nonzero(a)
num=np.array(b).ndim#非0值得个数
print(num)
print(b)
输出:
说明:索引1和索引2的位置上元素的值非零
2、二维数组(注意与一维数组进行比对)
#a是二维数组
a=np.array([[0,0,3],[0,9,0],[0,0,0]])
#这是输出非0元素位置
print(np.nonzero(a))
#这是求非0元素个数
print(np.array(b).ndim)
#分别从每一个维度描述索引值
add=np.transpose(np.nonzero(a))
print(add)
输出:
第一个(array([0, 1], dtype=int64), array([2,1], dtype=int64)) 其中array[0,1]从row值上对每个元素描述
array[2,1]从col值上对每个元素进行描述。
第二个2是非0元素个数;
第三个transpose()函数输出的是对第一得到的索引进行维度描述;输出的是两个非0元素的索引 位置;
即3的索引是[0,2],9的索引是[1,1]
举例:
3、三维数组这里不研究
三、
通过上面我们发现通过.nonzero()函数可以得到数组中行和列所在索引。
#构造二维数组
rratings=np.array([[1,0,0],[0,9,8],[0,0,5],[1,3,1]])
print(rratings)
输出:
print(rratings.nonzero())
输出:
print(rratings.nonzero()[0])
输出:
#表示输出索引为1的这一行的元素值
print(rratings[1,:])
输出:
#这时候这个输出的是列
print(rratings[1,:].nonzero()[0])
#注意此时输出[1]不是列,会报错
#print(rratings[1,:].nonzero()[1])
输出:(此时输出的是列数不是行数)
以上
对比:当用.matrix函数时
rratings[1,:].nonzero()[1]
才能正确表示选中某一行所在的列
我们引出下一篇,array与matrix函数的区别
https://blog.****.net/likeyou1314918273/article/details/89598158