從現(xiàn)有數(shù)組中取出一些元素并從中創(chuàng)建新數(shù)組稱為過濾(filtering)。
在 NumPy 中,我們使用布爾索引列表來過濾數(shù)組。
布爾索引列表是與數(shù)組中的索引相對應的布爾值列表。
如果索引處的值為 True,則該元素包含在過濾后的數(shù)組中;如果索引處的值為 False,則該元素將從過濾后的數(shù)組中排除。
用索引 0 和 2、4 上的元素創(chuàng)建一個數(shù)組:
import numpy as np arr = np.array([61, 62, 63, 64, 65]) x = [True, False, True, False, True] newarr = arr[x] print(newarr)
運行結(jié)果:
[61 63 65]
上例將返回 [61, 63, 65],為什么?
因為新過濾器僅包含過濾器數(shù)組有值 True 的值,所以在這種情況下,索引為 0 和 2、4。
在上例中,我們對 True 和 False 值進行了硬編碼,但通常的用途是根據(jù)條件創(chuàng)建過濾器數(shù)組。
創(chuàng)建一個僅返回大于 62 的值的過濾器數(shù)組:
import numpy as np arr = np.array([61, 62, 63, 64, 65]) # 創(chuàng)建一個空列表 filter_arr = [] # 遍歷 arr 中的每個元素 for element in arr: # 如果元素大于 62,則將值設置為 True,否則為 False: if element > 62: filter_arr.append(True) else: filter_arr.append(False) newarr = arr[filter_arr] print(filter_arr) print(newarr)
運行結(jié)果:
[False, False, True, True, True] [63 64 65]
創(chuàng)建一個過濾器數(shù)組,該數(shù)組僅返回原始數(shù)組中的偶數(shù)元素:
import numpy as np arr = np.array([1, 2, 3, 4, 5, 6, 7]) # 創(chuàng)建一個空列表 filter_arr = [] # 遍歷 arr 中的每個元素 for element in arr: # 如果元素可以被 2 整除,則將值設置為 True,否則設置為 False if element % 2 == 0: filter_arr.append(True) else: filter_arr.append(False) newarr = arr[filter_arr] print(filter_arr) print(newarr)
運行結(jié)果:
[False, True, False, True, False, True, False] [2 4 6]
上例是 NumPy 中非常常見的任務,NumPy 提供了解決該問題的好方法。
我們可以在條件中直接替換數(shù)組而不是 iterable 變量,它會如我們期望地那樣工作。
創(chuàng)建一個僅返回大于 62 的值的過濾器數(shù)組:
import numpy as np arr = np.array([61, 62, 63, 64, 65]) filter_arr = arr > 62 newarr = arr[filter_arr] print(filter_arr) print(newarr)
運行結(jié)果:
[False False True True True] [63 64 65]
創(chuàng)建一個過濾器數(shù)組,該數(shù)組僅返回原始數(shù)組中的偶數(shù)元素:
import numpy as np arr = np.array([1, 2, 3, 4, 5, 6, 7]) filter_arr = arr % 2 == 0 newarr = arr[filter_arr] print(filter_arr) print(newarr)
運行結(jié)果:
[False True False True False True False] [2 4 6]