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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1794閲覧

numpy配列の文字列要素を条件でしぼる(np.frompyfuncでの実装)

_nobu_

総合スコア27

NumPy

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/07/20 22:32

#開発環境
Jupyter notebook (python3)

#やりたかったこと
numpy配列の要素が数字の場合は指定した条件に一致するかをnumpy.bool_型の配列で返してくれるが,文字列だとうまく反応しないのでfrompyfuncを使って実装しようとした.

(リスト内包表記で実装できるのは理解しています)

##数字の場合

python

1a= np.array([0,1,2,3,4]) 2print((a > 2)) 3print(a[(a > 2)])

<出力>

[False False False True True] [3 4]

要素ごとに条件に一致しているか確認してくれている.

##文字列の場合

python

1a= np.array(['0L','1L','2T','3T','4L']) 2print('L' in a)

<出力>

False

要素ごとではなくnumpy配列全体に対して条件を確認してしまっている.これだとa[('L' in a)]としても上手くいかない.

##frompyfuncでの実装

python

1A = np.array(['0L','1L','2T','3T','4L']) 2 3def __in(x,y): 4 return (x in y) 5 6b = np.array([True,True,False,False,True]) 7c = [True,True,False,False,True] 8d = np.frompyfunc(__in, 2,1)('L',A) 9 10print(type(b)) 11print(type(b[0])) 12print(b) 13print(A[b]) 14 15print(type(c)) 16print(type(c[0])) 17print(c) 18print(A[c]) 19 20print(type(d)) 21print(type(d[0])) 22print(d) 23print(A[d])

<出力>

<class 'numpy.ndarray'> <class 'numpy.bool_'> [ True True False False True] ['0L' '1L' '4L'] <class 'list'> <class 'bool'> [True, True, False, False, True] ['0L' '1L' '4L'] <class 'numpy.ndarray'> <class 'bool'> [True True False False True] --------------------------------------------------------------------------- IndexError Traceback (most recent call last) <ipython-input-318-4e8bb2be31b9> in <module>() 21 print(type(d[0])) 22 print(d) ---> 23 print(A[d]) IndexError: arrays used as indices must be of integer (or boolean) type

numpy配列と通常のリストは上手くいってますが,np.frompyfuncのみエラーをはいています.

また,int型かbool型を使えとありますが出力の通り各要素はbool型になっています.

list(np.frompyfunc(__in, 2,1)('L',A))のようにリストに変換してからだと上手くいくのですがこの場合何が問題なのでしょうか.

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

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

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

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

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

_nobu_

2020/07/20 23:56

おお,便利ですね! ただboolで返してはくれないので今回の場合だと少し手間ですかね?
bsdfan

2020/07/21 00:01

np.char.find(A, 'L') >= 0 するだけなので、それほどの手間でもないと思います。
_nobu_

2020/07/21 00:23

あ,np.char.findがnumpy配列で返ってくるからそのまま条件文にできますね. こっちの方がスマートですね.ありがとうございます!
guest

回答1

0

ベストアンサー

面白い。下だと動きますねえ。
元のコードだとd.dtypeすると'bool'でなく'O'と出るので、そのせいでしょうか。

python3

1import numpy as np 2A = np.array(['0L','1L','2T','3T','4L']) 3 4def __in(x,y): 5 return (x in y) 6 7b = np.array([True,True,False,False,True]) 8c = [True,True,False,False,True] 9d = np.frompyfunc(__in, 2,1)('L',A).astype(bool) # astype付与 10 11print(type(b)) 12print(type(b[0])) 13print(b) 14print(A[b]) 15 16print(type(c)) 17print(type(c[0])) 18print(c) 19print(A[c]) 20 21print(type(d)) 22print(type(d[0])) 23print(d) 24print(A[d])

投稿2020/07/20 23:27

jeanbiego

総合スコア3966

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

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

_nobu_

2020/07/20 23:59

手元の環境でも実行できました. dtypeがboolかintでないと反応しないということなんですかね. 回答ありがとうございます!
jeanbiego

2020/07/21 00:36

>bsdfanさん ご確認ありがとうございます。そういえばドキュメントあたってませんでした。 >_nobuさん 解決したようで良かったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問