numpy-选择和过滤

numpy-选择和过滤

查找

np,where()

1、不带条件

返回tuple,第一个值是索引,第二个是空值

输入必须是 数组,不能是 list

输入一般是一维,行向量或者列向量都可以

2、带条件

np.where(condition, x, y)

满足条件(condition),输出x,不满足输出y

import numpy as np  
 
x = np.arange(9.).reshape(3,  3)  
print ('原数组:')
print (x)
print ( '大于 3 的元素的索引:')
y = np.where(x >  3)  
print (y)
print ('获取选择后的元素:')
print (x[y])

# 执行结果===========================
原数组:
[[0. 1. 2.]
 [3. 4. 5.]
 [6. 7. 8.]]
大于 3 的元素的索引:
(array([1, 1, 2, 2, 2], dtype=int64), array([1, 2, 0, 1, 2], dtype=int64))
获取选择后的元素:
[4. 5. 6. 7. 8.]


import numpy as np  
x = np.arange(9.).reshape(3,  3)  
a=np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

print(np.where(a < 5, a, 10*a))
[ 0  1  2  3  4 50 60 70 80 90]

np.extract()

where函数有一点相,不过extract函数是返回满足条件的元素

import numpy as np  
aa = np.arange(10)
print(np.extract(aa>8,aa))
# [9]

比较

比较是过滤的前提,因为通过比较才能确定过滤的条件。

数组和单个数字

import numpy as np

arr = np.random.randint(0, 10, (3, 3))
print(arr)
#运行结果
[[4 1 4]
 [7 6 1]
 [8 9 5]]

print(arr > 5)
#运行结果
[[False False False]
 [ True  True False]
 [ True  True False]]

数组和单个数字比较,也满足上一篇介绍的广播原则,也就是数组arr的每个元素都和数字5进行了比较。

比较的结果是和arr相同结构的数组,数组中的元素是bool值。 满足比较条件是True不满足比较条件的是False

数组和数组

除了和单个数字比较之外,数组之间也是可以比较的。

arr1 = np.random.randint(0, 10, (3, 3))
print(arr1)
#运行结果
[[9 7 3]
 [2 8 5]
 [2 2 3]]

arr2 = np.random.randint(0, 10, (3, 3))
print(arr2)
#运行结果
[[1 6 0]
 [0 1 8]
 [9 0 5]]

print(arr1 > arr2)
#运行结果
[[ True  True  True]
 [ True  True False]
 [False  True False]]

数组之间的比较就是相同位置的元素之间比较,如果两个数组的结构不一样,会按照上一篇介绍的广播计算方式来扩充数组。 比如:

arr1 = np.random.randint(0, 10, (3, 3))
print(arr1)
#运行结果
[[9 6 0]
 [1 4 9]
 [1 1 4]]

arr2 = np.random.randint(0, 10, (3, 1))
print(arr2)
#运行结果
[[1]
 [0]
 [9]]

print(arr1 > arr2)
#运行结果
[[ True  True False]
 [ True  True  True]
 [False False False]]

过滤

过滤就是根据掩码,选择出符合条件的元素。

所谓掩码就是相同维度的.布尔型数据
[[ True  True False]
 [ True  True  True]
 [False False False]]

单条件过滤

arr = np.random.randint(0, 10, (3, 3))
print(arr)
#运行结果
[[8 4 0]
 [2 2 9]
 [9 5 9]]

print(arr[arr > 5])
#运行结果
[8 9 9 9]

最后得到的是arr中值大于5的元素数组。 其中 arr > 5 的结果就是上一节提到的掩码,最后过滤出的元素就是根据这个掩码得到的。

arr1 = np.random.randint(0, 10, (3, 3))
print(arr1)
#运行结果
[[3 4 7]
 [4 6 2]
 [7 2 1]]

arr2 = np.random.randint(0, 10, (3, 3))
print(arr2)
#运行结果
[[2 3 1]
 [7 7 7]
 [1 6 4]]

print(arr1[arr1 > arr2])
#运行结果
[3 4 7 7]

多条件过滤

多条件过滤使用 &| 来连接不同的条件。

arr1 = np.random.randint(0, 10, (3, 3))
print(arr1)
#运行结果
[[1 0 5]
 [7 4 9]
 [8 5 4]]

arr2 = np.random.randint(0, 10, (3, 3))
print(arr2)
#运行结果
[[6 4 1]
 [0 1 1]
 [8 5 8]]

print(arr1[(arr1 > 5) & (arr1 > arr2)])
#运行结果
[7 9]

过滤arr1大于5** 并且 **对应位置比arr2大的元素。

arr1 = np.random.randint(0, 10, (3, 3))
print(arr1)
#运行结果
[[1 0 5]
 [7 4 9]
 [8 5 4]]

arr2 = np.random.randint(0, 10, (3, 3))
print(arr2)
#运行结果
[[6 4 1]
 [0 1 1]
 [8 5 8]]

print(arr1[(arr1 > 5) | (arr1 > arr2)])
#运行结果
[5 7 4 9 8]

过滤arr1大于5 或者对应位置比arr2大的元素。

posted @ 2023-07-30 18:01  贝壳里的星海  阅读(112)  评论(0编辑  收藏  举报