要件をお伺いするに、たくさんのデータ点を同時に処理したいという状況であるようにお見受けいたしました。こうした場合は、もし可能であればpandasを使うのがもっとも楽かと思います。(そうでない場合はhayataka2049様の回答が参考になるかと思いますので、pandasを使わない回答は省略します)
詳細
pandasをimportします。
python
1import pandas as pd
Aと、Aの情報を格納したpandasのDataFrameを作ります。
python
1A = [
2 [0, 0, 3],
3 [0, 2, 5],
4 [2, 1, 4],
5]
6df_A = pd.DataFrame(A, columns=['x', 'y', 'h'])
7print(df_A)
print文の出力は以下のようになります。
sh
1 x y h
20 0 0 3
31 0 2 5
42 2 1 4
Bに関しても同様にDataFrameを作ります。
python
1B = [
2 [0, 0, 1],
3 [0, 1, 1],
4 [0, 2, 1],
5 [1, 0, 1],
6 [1, 1, 1],
7 [1, 2, 1],
8 [2, 0, 1],
9 [2, 1, 1],
10 [2, 2, 1],
11]
12df_B = pd.DataFrame(B, columns=['x', 'y', 'h'])
13print(df_B)
print文の出力は以下のようになります。
sh
1 x y h
20 0 0 1
31 0 1 1
42 0 2 1
53 1 0 1
64 1 1 1
75 1 2 1
86 2 0 1
97 2 1 1
108 2 2 1
df_A
と df_B
をマージします。感覚的には、 df_B
に対して、 x
と 'y' が一致する行を df_A
からうまく選んで右側にくっつける感じです。
python
1df_merged = pd.merge(df_B, df_A, how='left', on=['x', 'y'])
2print(df_merged)
print文の出力は以下のようになります。
sh
1 x y h_x h_y
20 0 0 1 3.0
31 0 1 1 NaN
42 0 2 1 5.0
53 1 0 1 NaN
64 1 1 1 NaN
75 1 2 1 NaN
86 2 0 1 NaN
97 2 1 1 4.0
108 2 2 1 NaN
df_merged
の h_y
を使いたいですが、 df_A
に値が存在しなかった 'x', 'y' についてはNaNになってしまっているため、ダミーの値で h_y
を埋めます。
python
1dummy_value = 1
2df_filled = df_merged.fillna(dummy_value)
3print(df_filled)
print文の出力は以下のようになります。
x y h_x h_y
0 0 0 1 3.0
1 0 1 1 1.0
2 0 2 1 5.0
3 1 0 1 1.0
4 1 1 1 1.0
5 1 2 1 1.0
6 2 0 1 1.0
7 2 1 1 4.0
8 2 2 1 1.0
最後に、 x
, y
, h_y
のみを残せば、所望の値が得られると思います。
df_result = df_filled[['x', 'y', 'h_y']]
print(df_result)
print文の出力は以下のようになります。
python
1 x y h_y
20 0 0 3.0
31 0 1 1.0
42 0 2 5.0
53 1 0 1.0
64 1 1 1.0
75 1 2 1.0
86 2 0 1.0
97 2 1 4.0
108 2 2 1.0
なお、
を呼び出すと、 pd.DataFrame
から np.ndarray
形式のデータに変換することもできます。
コード全文
python
1import pandas as pd
2
3A = [
4 [0, 0, 3],
5 [0, 2, 5],
6 [2, 1, 4],
7]
8df_A = pd.DataFrame(A, columns=['x', 'y', 'h'])
9print(df_A)
10
11B = [
12 [0, 0, 1],
13 [0, 1, 1],
14 [0, 2, 1],
15 [1, 0, 1],
16 [1, 1, 1],
17 [1, 2, 1],
18 [2, 0, 1],
19 [2, 1, 1],
20 [2, 2, 1],
21]
22df_B = pd.DataFrame(B, columns=['x', 'y', 'h'])
23print(df_B)
24
25df_merged = pd.merge(df_B, df_A, how='left', on=['x', 'y'])
26print(df_merged)
27
28dummy_value = 1
29df_filled = df_merged.fillna(dummy_value)
30print(df_filled)
31
32df_result = df_filled[['x', 'y', 'h_y']]
33print(df_result)