Python 2次元でnumpy.linspaceを使う

Programming
スポンサーリンク

はじめに

やりたかったことはPythonで下記に示すような3次元の numpy.ndarray を作ることです。

np.arange([2x2アレイ], [2x2アレイ], 1) とかですぐ作れるかと思ったのですが、できずに少し困ったので備忘録として記載します。

コード

下記のように np.linspace(start=2darray, stop=2darray, num=int, axis=2, endpoint=False) とすれば所望のnumpy配列が生成できました。

# Generate 2D time array
start_values_2d = np.array([[0, -5, -10], [0, -5, -10]])
num_points_2d = 50
step_value_2d = 1
end_values_2d = start_values_2d + num_points_2d * step_value_2d
t_2d = np.linspace(
    start=start_values_2d, stop=end_values_2d, num=num_points_2d, axis=2, endpoint=False
)

ちなみに、そもそもこれを使って何をしようとしていたかというのを以下に記載しておこうと思います。

コードの全体像は下記のようになっています。

このコードは、まずオリジナルデータとして細かいステップの1次元NumPy配列を生成します。次に、2次元の各画素ごとに、この1次元のデータから特定の範囲をダウンサンプリングして抜き出します。この抜き出す範囲は、2次元の時間配列 t_2d によって指定されます。この t_2d は、各画素の時間値を表す配列であり、その値に基づいてダウンサンプリング範囲が選択されます。

t_2d を生成する際には、特定の軸(ここではz方向、axis=2)において要素数とステップ量が一致するため、numpy.linspace を使用します。numpy.arange() が使えなかったため、若干の工夫が必要でした。

その後、各要素の値に最も近いオリジナルデータの時間値のインデックスを np.searchsorted を使用して求め、そのインデックスに基づいて data_original から対応する値を取得します。

このコードの処理は、高次元データの特定の範囲を選択的にダウンサンプリングするために利用されており、特に時間データに焦点を当てています。

import numpy as np

# Generate original data
start_original = -100
stop_original = 100
step_original = 0.1
t_original = np.arange(
    start=start_original, stop=stop_original + step_original, step=step_original
)
data_original = t_original * 10

# Generate 2D time array
start_values_2d = np.array([[0, -5, -10], [0, -5, -10]])
num_points_2d = 50
step_value_2d = 1
end_values_2d = start_values_2d + num_points_2d * step_value_2d
t_2d = np.linspace(
    start=start_values_2d, stop=end_values_2d, num=num_points_2d, axis=2, endpoint=False
)

# Find closest indices
closest_indices = np.searchsorted(t_original, t_2d)

# Use the indices to sample the original data for all pixels at once
result_2d = data_original[closest_indices]

# Output the result
print(result_2d)

おわりに

あまり使う機会はないと思いますが、備忘録として。

コメント

タイトルとURLをコピーしました