NumPy の配列で要素をフィルタリングする
-
NumPy の
fromiter()
メソッドを使用して要素をフィルタリングする - NumPy でブールマスクスライス法を使用して要素をフィルタリングする
-
NumPy の
where()
メソッドを使用して要素をフィルタリングする
多くの場合、特定の配列からの値が必要です。通常は昇順または降順のいずれかです。場合によっては、配列から要素を検索して取得したり、条件に基づいて値をフィルタリングしたりする必要もあります。
この記事では、NumPy 配列から値をフィルタリングする方法を紹介します。
NumPy の fromiter()
メソッドを使用して要素をフィルタリングする
fromiter()
は、引数として渡される反復可能なオブジェクトから新しい 1 次元配列を作成します。入力配列要素に条件を適用し、さらにその新しい配列をこの関数に与えて、NumPy 配列内の目的の要素を取得できます。
fromiter()
メソッドの構文は次のとおりです。
fromiter(iterable, dtype, count, like)
以下のパラメータがあります。
iterable
- 関数が反復する反復可能なオブジェクト。dtype
- このパラメーターは、返される配列のデータ型を参照します。count
- これはオプションの整数パラメーターであり、反復可能オブジェクトで読み取られる要素の数を参照します。このパラメータのデフォルト値は-1
です。これは、すべての要素が読み取られることを意味します。like
- これはオプションのブールパラメータです。返される配列の定義を制御します。
NumPy の fromiter()
メソッドを使用して要素をフィルタリングする方法は次のとおりです。
import numpy as np
myArray = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
newArray = np.fromiter(
(element for element in myArray if element < 6), dtype=myArray.dtype
)
print(myArray)
print(newArray)
出力:
[1 2 3 4 5 6 7 8 9]
[1 2 3 4 5]
まず、要素をフィルタリングする NumPy 配列を初期化します。次に、配列全体を反復処理し、6
未満の値を除外します。次に、この新しい配列を、元の配列と同じデータ型の NumPy 配列にキャストします。
この方法の詳細については、その公式ドキュメントを参照してください。
NumPy でブールマスクスライス法を使用して要素をフィルタリングする
この方法は少し奇妙ですが、NumPy の魅力のように機能します。配列の後の角括弧 []
内の条件について言及する必要があります。次に、NumPy は条件に基づいて要素をフィルターで除外し、新しいフィルター処理された配列を返します。
この概念は明確ではなく、一部の人にとってはトリッキーに見えるかもしれませんが、心配しないでください。それをもう少しよく説明するために、以下にいくつかの例があります。
import numpy as np
myArray = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
newArray1 = myArray[myArray < 6] # Line 1
newArray2 = myArray[myArray % 2 == 0] # Line 2
newArray3 = myArray[myArray % 2 != 0] # Line 3
newArray4 = myArray[np.logical_and(myArray > 1, myArray < 5)] # Line 4
newArray5 = myArray[np.logical_or(myArray % 2 == 0, myArray < 5)] # Line 5
print(myArray)
print(newArray1)
print(newArray2)
print(newArray3)
print(newArray4)
print(newArray5)
出力:
[1 2 3 4 5 6 7 8 9]
[1 2 3 4 5]
[2 4 6 8]
[1 3 5 7 9]
[2 3 4]
[1 2 3 4 6 8]
上記のように、角括弧の間にいくつかの条件を追加し、それらの条件に基づいてターゲット配列をフィルタリングしました。配列を格納する変数(この場合は myArray
)は、角括弧内の配列の単一要素を表します。
複数の条件を適用して論理演算子を使用するには、2つの NumPy メソッド、つまり、論理と
またはまたは
にそれぞれ logical_and()
と logical_or()
を使用します。
myArray < 6
- 6 未満の値をフィルタリングしますmyArray % 2 == 0
- 2 で割り切れる値をフィルタリングしますmyArray % 2 != 0
- 2 で割り切れない値をフィルタリングしますnp.logical_and(myArray > 1, myArray < 5)
- 1 より大きい値と 5 より小さい値をフィルタリングします。np.logical_or(myArray % 2 == 0, myArray < 5)
- 2 で割り切れる値または 5 未満の値をフィルタリングします。
NumPy の where()
メソッドを使用して要素をフィルタリングする
これが NumPy ライブラリの where()
メソッドを使用する最後のメソッドです。条件に基づいてターゲット配列から要素をフィルタリングし、フィルタリングされた要素のインデックスを返します。
このメソッドを使用して、条件を満たす要素の値を変更することもできます。
where()
メソッドの構文を以下に示します。
where(condition, x, y)
以下のパラメータがあります。
condition
- 配列の各要素がチェックされるブール条件です。x
- 条件を満たす要素に与えられる値、または満たす要素で実行される計算です。y
- 条件を満たさない要素に与えられる値、または満たされない要素で実行される計算です。
この関数を使用して要素を除外する方法を見てみましょう。
import numpy as np
myArray = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
newArray1 = myArray[np.where(myArray < 7)[0]]
newArray2 = myArray[np.where(myArray % 2 == 0)[0]]
newArray3 = myArray[np.where(myArray % 2 != 0)[0]]
print(myArray)
print(newArray1)
print(newArray2)
print(newArray3)
出力:
[1 2 3 4 5 6 7 8 9]
[1 2 3 4 5 6]
[2 4 6 8]
[1 3 5 7 9]
上記のスニペットでは、条件を満たすすべての要素が配列として返されました。
where()
関数は、NumPy 配列のタプルを返します。したがって、最初の配列のみを検討します。これが私たちの答えです。
上で述べたように、要素が指定された条件を満たす場合と満たさない場合に、カスタム値を割り当てて要素に対してカスタムアクションを実行することもできます。
以下はその一例です。
import numpy as np
myArray = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
newArray1 = np.where(myArray < 7, 5, -1)
newArray2 = np.where(myArray % 2 == 0, myArray ** 2, 0)
newArray3 = np.where(myArray % 2 != 0, myArray, -1)
newArray4 = np.where(myArray % 2 != 0, myArray, myArray)
newArray5 = np.where(myArray % 2 != 0, 0, myArray)
print(myArray)
print(newArray1)
print(newArray2)
print(newArray3)
print(newArray4)
print(newArray5)
出力:
[1 2 3 4 5 6 7 8 9]
[ 5 5 5 5 5 5 -1 -1 -1]
[ 0 4 0 16 0 36 0 64 0]
[ 1 -1 3 -1 5 -1 7 -1 9]
[1 2 3 4 5 6 7 8 9]
[0 2 0 4 0 6 0 8 0]
出力を見てください。条件に基づいて、および要素を where()
関数に操作するために提供した値と計算に基づいて、要素がどのように変化するかを確認してください。