numpy的nonzero()和logical_and/or/not()

版权声明:本文为博主原创文章,转载请附上此地址。 https://blog.csdn.net/qq_36523839/article/details/82318061

由于最近学习的资料频繁出现numpy中的两个方法:nonzero()logical_and/or/not()两个用于判断的函数。由于觉得确实很方便(如果不使用pandas处理数据),所以这里对两个方法做一个记录,以便后面的使用参考。

np.nonzero(参数):

    no.nonzero()函数是numpy中用于得到数组array中非零元素的位置(数组索引)的函数,很适合用来对数据下标的提取。着重需要强调的是nonzero函数中不仅可以放数值矩阵/行列,同样可以放布尔型(True、False)矩阵/行列,由于这个特性其适用范围更加的广泛和优秀,下面做一个简单的介绍和数据的实践。

  1. 只有df中非零元素才会有索引值,那些零值元素没有索引值;
  2. 返回的索引数值是一个二维的tuple数组,tuple中包含一维的array数组。每个array数组都是对一维数据判断的描述;
  3. 索引值数组的每一个array均是从一个维度上来描述其索引值。比如,如果df是一个二维数组,则索引值数组有两个array,第一个array从行维度来描述索引值;第二个array从列维度来描述索引值;
  4. 该np.transpose(np.nonzero(df)) 函数能够描述出每一个非零元素在不同维度的索引值;
  5. 通过df[nonzero(df)]得到所有a中的非零值;
  6. 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]])

# 原始矩阵
print(df)

# 获得第一列和第二列的布尔值,并将两者做与操作
result = np.logical_and(df[:,0]>0,df[:,1]>0)
print(df[:,0]>0,df[:,1]>0)
print(result)

# [ True  True False] [False  True  True]
# [False  True False]

# 或操作一个为真全为真
result = np.logical_or(df[:,0]>0,df[:,1]>0)
print(df[:,0]>0,df[:,1]>0)
print(result)

# [ True  True False] [False  True  True]
# [ True  True  True]

result = np.logical_not(df[:,0]>0)
result2 = np.logical_not(df[:,1]>0)
print(df[:,0]>0,df[:,1]>0)
print(result,result2)

# [ True  True False] [False  True  True]
# [False False  True] [ True False False]

简单说明如上代码,最后附上nonzero函数与logical_and函数结合的一个例子:

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的行号
result = np.nonzero(np.logical_and(df[:,0]>0,df[:,1]>0))
print(df[:,0]>0,df[:,1]>0)
print(result[0])

# [ True  True False] [False  True  True]
# [1]

极为方便的矩阵处理方法,可以应用与很多的情况,以上代码仅是做了简单的常用说明,具体问题具体分析使用。

猜你喜欢

转载自blog.csdn.net/qq_36523839/article/details/82318061