NumPy配列の符号を自在に操る!np.sign, np.copysignで正負を判定・変換


 

データ分析や数値処理において、数値の**符号(正負)**に着目したり、符号に基づいて値を操作したりする場面は頻繁にあります。例えば、数値が正か負かゼロかを判定したり、ある数値の符号を別の数値にコピーしたりするケースです。NumPyライブラリは、これらの符号関連の操作を効率的に行うための便利な関数を提供しています。この記事では、NumPy配列(ndarray)の符号を取得・判定・置換するためのnp.sign()関数とnp.copysign()関数について、具体的なサンプルコードを交えながら詳しく解説します。


 

np.sign():符号を取得・判定する

 

np.sign()は、NumPy配列の各要素の符号を示す値を返します。

 

書式

 

Python
 
numpy.sign(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature, extobj])
  • x: 符号を取得したい元の配列(ndarray)または数値。

  • out (オプション): 結果を格納する配列。指定しない場合は新しい配列が作成されます。

 

np.sign()の戻り値

 

np.sign()は、入力された要素の符号に応じて以下の値を返します。

  • 正の数: 1

  • 負の数: -1

  • ゼロ: 0 (浮動小数点数の場合、正のゼロは0.0、負のゼロは-0.0を返すことがあります)

  • NaN: NaN

 

1. 1次元配列での使用

 

 

サンプルコード

 

Python
 
import numpy as np

arr = np.array([-5, 0, 10, -3.5, np.nan])

# 各要素の符号を取得
signs = np.sign(arr)
print("元の配列:", arr)
print("符号配列:", signs)

 

出力例

 

元の配列: [-5.   0.  10.  -3.5  nan]
符号配列: [-1.  0.  1. -1.  nan]

 

2. 多次元配列での使用

 

np.sign()は多次元配列に対しても要素ごとに機能し、元の形状を維持した新しい配列を返します。

 

サンプルコード

 

Python
 
import numpy as np

arr_2d = np.array([[-10, 0, 5],
                   [2.5, -7, np.nan]])
print("元の配列:\n", arr_2d)

# 各要素の符号を取得
signs_2d = np.sign(arr_2d)
print("\n符号配列:\n", signs_2d)

 

出力例

 

元の配列:
 [[-10.   0.   5. ]
 [  2.5 -7.   nan]]

符号配列:
 [[-1.  0.  1.]
 [ 1. -1.  nan]]

 

np.copysign():符号をコピーして値を置換する

 

np.copysign()は、ある数値の絶対値に、別の数値の符号をコピーして新しい値を生成します。

 

書式

 

Python
 
numpy.copysign(x1, x2, /[, out, where, casting, order, …])
  • x1: 絶対値の源となる配列または数値。

  • x2: 符号の源となる配列または数値。

  • out (オプション): 結果を格納する配列。

 

1. スカラ値での使用

 

 

サンプルコード

 

Python
 
import numpy as np

# 10の絶対値に-3の符号をコピー
result_scalar1 = np.copysign(10, -3)
print("10の絶対値に-3の符号をコピー:", result_scalar1)

# -5の絶対値に7の符号をコピー
result_scalar2 = np.copysign(-5, 7)
print("-5の絶対値に7の符号をコピー:", result_scalar2)

 

出力例

 

10の絶対値に-3の符号をコピー: -10.0
-5の絶対値に7の符号をコピー: 5.0

 

2. 配列での使用(要素ごとの処理)

 

np.copysign()は、2つの配列間で要素ごとに符号のコピーを行います。ブロードキャストも適用されます。

 

サンプルコード

 

Python
 
import numpy as np

magnitudes = np.array([10, 20, 30])    # これらの値の絶対値を使う
signs_source = np.array([-1, 0, 1])  # これらの値の符号を使う

# magnitudesの絶対値にsigns_sourceの符号をコピー
result_array = np.copysign(magnitudes, signs_source)
print("元の絶対値の配列:", magnitudes)
print("符号源の配列:", signs_source)
print("符号コピー後の配列:", result_array)

 

出力例

 

元の絶対値の配列: [10 20 30]
符号源の配列: [-1  0  1]
符号コピー後の配列: [-10.   0.  30.]

 

3. 多次元配列での使用

 

多次元配列でも、np.copysign()は要素ごとに作用します。

 

サンプルコード

 

Python
 
import numpy as np

arr_data = np.array([[10, -20],
                     [-30, 40]])
arr_signs = np.array([[-1, 1],
                      [1, -1]])

# arr_dataの絶対値にarr_signsの符号をコピー
result_2d = np.copysign(arr_data, arr_signs)
print("データ配列:\n", arr_data)
print("\n符号源配列:\n", arr_signs)
print("\n符号コピー後の配列:\n", result_2d)

 

出力例

 

データ配列:
 [[ 10 -20]
 [-30  40]]

符号源配列:
 [[-1  1]
 [ 1 -1]]

符号コピー後の配列:
 [[-10.  20.]
 [ 30. -40.]]

 

まとめ

 

NumPyのnp.sign()np.copysign()は、配列内の数値の符号を効率的に操作するための強力なツールです。

  • np.sign(arr): 配列の各要素の符号を**1 (正), -1 (負), 0 (ゼロ), NaN (NaN)**で取得・判定します。

  • np.copysign(magnitudes, signs_source): magnitudesの絶対値にsigns_sourceの符号をコピーして、新しい配列を生成します。

これらの関数は、データの正規化、特定の条件に基づくフィルタリング、数値シミュレーションなど、幅広いデータ処理の場面で活用されます。符号の操作をマスターすることで、より柔軟で表現力豊かなNumPyコードを書くことができるでしょう。ぜひ、あなたのNumPyワークフローに取り入れてみてください!