質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

5103閲覧

numpyで二つの二次元配列よりそれぞれ1列目の値を探索し、列の値が同じ場合はその行を抽出し、配列を再構成したい。

Kevin1028

総合スコア1

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/12/08 13:08

編集2020/12/08 14:19

numpyで二つの二次元配列よりそれぞれ1列目の値を探索し、列の値が同じ場合はその行を抽出し、配列を再構成したいです。

二つの二次元配列の1列目を参照し、同じ値の要素を見つけ出します。
見つけ出したその要素と同じ行の行列を抽出(例えば2行1列目の要素の値が同じであれば、2行目すべてを抽出)したいです。

例えば
a =[[1 10 11 12]
[2 13 14 15]
[3 16 17 18]
[4 19 20 21]]

b= [[2 20 21 22]
[3 23 24 25]
[4 26 27 28]
[5 29 30 31]
[6 32 33 34]]

この二つの配列の1列目を参照して(2,3,4が同じ値のため、その行全体を抽出)

a =[[2 13 14 15]
[3 16 17 18]
[4 19 20 21]]

b= [[2 20 21 22]
[3 23 24 25]
[4 26 27 28]]

のような処理を行いたいです。

参照するのは1列目のみで、2~4列目はただコピーするだけにしたいです。

発生している問題・エラーメッセージ

処理自体は回るのですが、以下のエラーメッセージが出て、すべて0を返してしまいます。

__main__:1: DeprecationWarning: elementwise comparison failed; this will raise an error in the future.

該当のソースコード

python

1 2c = np.where(a[:,0] == b[:,0], a, False) 3

試したこと

common_element = np.intersect1d(a,b) c = np.where(common_element == b[:,0], a, False)

このようなコードで、a,bの共通項を抽出することはできたのですが、全く同じエラーを返してしまいます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2020/12/08 14:05

> 二つの二次元配列から同じ要素とその行を抽出 条件がよく分かりません。もう少し説明してもらえませんか?
guest

回答2

0

おそらく質問者さんがやりたかったのはこういうことでしょう。

python

1import numpy as np 2 3a = np.array([[1, 10, 11, 12], 4 [2, 13, 14, 15], 5 [3, 16, 17, 18], 6 [4, 19, 20, 21]]) 7b = np.array([[2, 20, 21, 22], 8 [3, 23, 24, 25], 9 [4, 26, 27, 28], 10 [5, 29, 30, 31], 11 [6, 32, 33, 34]]) 12common_element = np.intersect1d(a[:, 0], b[:, 0]) 13 14a[np.isin(a[:, 0], common_element)] 15# array([[ 2, 13, 14, 15], 16# [ 3, 16, 17, 18], 17# [ 4, 19, 20, 21]]) 18 19b[np.isin(b[:, 0], common_element)] 20# array([[ 2, 20, 21, 22], 21# [ 3, 23, 24, 25], 22# [ 4, 26, 27, 28]])

[1 2 3 4]から[2 3 4]と重なる値を抜き出すにはnp.isin()(またはnp.in1d())を使います。
numpy.isin — NumPy Manual
配列 == 配列は配列の要素ごとの比較を行おうとしますが、[1 2 3 4][2 3 4]は長さが異なり要素ごとの比較ができないため、警告が出ます。

投稿2020/12/08 16:31

kirara0048

総合スコア1399

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kevin1028

2020/12/10 00:32

ありがとうございます! このような関数があったのですね・・・ もっと勉強します!
guest

0

ベストアンサー

各配列の1列目の要素から重複するものを抽出し、それらが各配列の何行目にあたるかで行を抽出しました。

Python

1import numpy as np 2 3a = np.array([[1,10,11,12], 4[2,13,14,15], 5[3,16,17,18], 6[4,19,20,21]]) 7 8b = np.array([[2,20,21,22], 9[3,23,24,25], 10[4,26,27,28], 11[5,29,30,31], 12[6,32,33,34]]) 13 14c = [i for i in a[:,0] if i in b[:,0]] 15d = a[[i for i in range(len(a[:,0])) if a[:,0][i] in c],:] 16e = b[[i for i in range(len(b[:,0])) if b[:,0][i] in c],:] 17 18print(d) 19#[[ 2 13 14 15] 20# [ 3 16 17 18] 21# [ 4 19 20 21]] 22print(e) 23#[[ 2 20 21 22] 24# [ 3 23 24 25] 25# [ 4 26 27 28]]

投稿2020/12/08 14:35

meg_

総合スコア10602

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kevin1028

2020/12/08 15:09

できました! 大変助かりました!本当にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問