從numpy陣列中取出滿足條件的元素
阿新 • • 發佈:2019-01-11
例如問題:從 arr 陣列中提取所有奇數元素。
input:arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
output: #> array([1, 3, 5, 7, 9])
Solution:
#Input
>>> arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
#Solution
arr = arr[arr % 2 == 1]
>>> array([1, 3, 5, 7, 9])
這是對奇數元素的提取,其他條件同理,在這個問題上我們深入再學習一下,首先 numpy 中的 array 陣列是可以直接對陣列中的每個元素進行處理的。例如我們想對每個元素減一:
#input
>>> arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
#Solution
>>> arr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> arr - 1
array([-1, 0, 1, 2, 3, 4, 5, 6, 7, 8])
從上面的例子我們可以看出來,對 arr 直接進行減一操作,結果是對每一個元素都進行了減一的操作,陣列的維度不變,為了滿足取出特定條件的元素這個操作,我們可以進行條件判斷,例如判斷每個元素是否為奇數:
#input
>>> arr = np.arange(10)
>>> arr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
#solution
>>> arr % 2 == 1
array([False, True, False, True, False, True, False, True, False, True])
由此可見,條件判斷後輸出為和 arr 相同維度的陣列,但是其中每個元素為布林型別的值,取值為陣列 arr 對每個元素分別進行條件判斷的結果。
下面我們分析對 arr 陣列進行特定取值,給其一個布林型別的 arr 陣列,並且維度與 arr 相同,以此得到取值的目的:
#input
>>> arr_bool = np.array([1, 1, 0, 0, 1, 1, 0, 0, 1, 1], dtype=bool)
>>> arr_bool
array([ True, True, False, False, True, True, False, False, True, True])
#solution
>>> arr[arr_bool]
array([0, 1, 4, 5, 8, 9])
從上述例子,我們構建了一個布林型別的陣列為 arr_bool ,並且維度與 arr 相同,進行直接嵌入實現了取值,以此完成了我們最終的目的,可以對任意滿足條件的元素進行提取。並且理解了其中的原理。
PS:番外篇,如果維度不同可以嗎?
#input
>>> arr_bool = np.ones(11, dtype=bool)
>>> arr_bool
array([ True, True, True, True, True, True, True, True, True, True, True]) #注意!!這裡有11個 True 哦。
#solution
>>> arr[arr_bool]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: boolean index did not match indexed array along dimension 0; dimension is 10 but corresponding boolean dimension is 11
由上可見,維度必須保持一致,從 arr 數組裡才可以按照 bool 型別取出對應位置為 True 的元素。這個性質幫助我們可以更靈活的處理 numpy 陣列。
PS2: 如何替換滿足條件的元素為其它值呢?
>>> arr = np.arange(10)
>>> arr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> arr[arr%2 == 1] = -1
>>> arr
array([ 0, -1, 2, -1, 4, -1, 6, -1, 8, -1])