一、numpy的nonzero()和logical_and/or/not()
np.nonzero(参数):
no.nonzero()函数是numpy中用于得到数组array中非零元素的位置(数组索引)的函数,很适合用来对数据下标的提取。着重需要强调的是nonzero函数中不仅可以放数值矩阵/行列,同样可以放布尔型(True、False)矩阵/行列,由于这个特性其适用范围更加的广泛和优秀,下面做一个简单的介绍和数据的实践。
只有df中非零元素才会有索引值,那些零值元素没有索引值;
返回的索引数值是一个二维的tuple数组,tuple中包含一维的array数组。每个array数组都是对一维数据判断的描述;
索引值数组的每一个array均是从一个维度上来描述其索引值。比如,如果df是一个二维数组,则索引值数组有两个array,第一个array从行维度来描述索引值;第二个array从列维度来描述索引值;
该np.transpose(np.nonzero(df)) 函数能够描述出每一个非零元素在不同维度的索引值;
通过df[nonzero(df)]得到所有a中的非零值;
nonzero函数中可以适用布尔型矩阵,等同于对0、1矩阵的判断(这个布尔值可以是我们对矩阵的判断条件)。
代码(大多适用的情况):
# 所有数据皆从0开始索引
import numpy as np
df = np.array([[1,0,1],[2,2,0,],[0,3,2]])
print(df)
# 原始矩阵
# [[1 0 1]
# [2 2 0]
# [0 3 2]]
# 返回每个非0元素坐标的tuple数组(包含行、列描述信息)
result = np.nonzero(df)
print(result)
print(result[0],result[1]) # 行描述、列描述
# (array([0, 0, 1, 1, 2, 2], dtype=int64), array([0, 2, 0, 1, 1, 2], dtype=int64))
# [0 0 1 1 2 2] [0 2 0 1 1 2]
# 返回每个非0元素坐标
result = np.transpose(np.nonzero(df))
print(result)
# [[0 0]
# [0 2]
# [1 0]
# [1 1]
# [2 1]
# [2 2]]
# 返回所有非0值
result = df[np.nonzero(df)]
print(result)
# [1 1 2 2 3 2]
# 对矩阵第二列判断
result = np.nonzero(df[:,1])
print(result)
# (array([1, 2], dtype=int64),) # 由于数据为1列,所以tuple返回一个array数组
# 布尔值判断
# 判断矩阵第三列中大于1值值的行号
result = np.nonzero(df[:,2]>1)
print(df[:,2]>1)
print(result)
# [False False True]
# (array([2], dtype=int64),)
结合判断条件nonzero在矩阵中有着很大的操作空间(节约大量时间和代码量)。
logical_and/or/not(参数):
逻辑(与或非)运算,三者的调用方式:np.logical_and(x1, x2, *args, **kwargs) 非not没有x2参数
这里值得提醒一下的是,该方法可以结合上面的nonzero函数一同使用,做一个结合判断取值的方法。
与或非的使用自行学习,或者参考下面的代码输出来判断。我们依旧使用上面的数据矩阵来说明问题:
# 所有数据皆从0开始索引
import numpy as np
df = np.array([[1,0,1],[2,2,0,],[0,3,2