🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
NumPy

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

Python 3.x

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

2433閲覧

[Python3] numpy, series, dataframeで、1列のデータをまとめて比較したい(loopを使わずに)

siruku6

総合スコア1382

NumPy

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

Python 3.x

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2019/09/20 23:47

編集2019/09/20 23:49

実現したいこと

python

1a = np.array([None, None, 1, 3]) 2b = np.array([True, 'hoge', 2, 0]) 3 4# ...ここで何か計算してcに代入 5# 内容としては、a が None なら、同じ index の位置にある b の値を c に代入する 6# a が None 以外なら b の値は無視する 7 8print(c) 9=> [True, 'hoge', 1, 3]

上記のような処理を実装したいのですが方法がわかりません。
forwhile を使用すれば簡単に実装できることはわかっていて既に実装済みですが、それを使うつもりはありません。
何万回もloopが発生するため、処理時間がかかかり過ぎてしまうためです。

そうではなく、numpy配列の特性を利用して、applyメソッドなどを利用してまとめて計算したいと考えています。

numpyは次のような計算ができると聞いています

python

1a = np.array([1, 2, 3]) 2b = np.array([4, 5, 6]) 3c = a + b 4 5print(c) 6=> [5, 7, 9]

このように、まとめて計算したいのです。
また、numpyに限らず、series や dataframe列同士の演算でも同じことを実現したいと考えています。

補足

もう一度書いておきますが、for や while といった loop は処理速度に問題が生じるため使いたくありません。

python

1a = np.array([None, None, 1, 3]) 2b = np.array([True, 'hoge', 2, 0]) 3c = [] 4 5for (a_i, b_i) in zip(a, b): 6 c.append(a_i or b_i) 7 8print(c)

こんな感じで実装できそうなことはなんとなくわかっていますが、こういったloop処理の速度を改善するために質問しております。

参考資料の提示のみでも構いません

お手数ですが、こういった処理方法が書かれている本やwebサイトがありましたら、それをご教示いただけるだけでも構いません。

また、「Pythonによるデータ分析入門 Numpy, pandas を使ったデータ処理」は所有しておりますので、記載されている該当ページをご教示いただくだけでも構いません(私は見つけられませんでした)....

ご協力お願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

numpyのvectorizeかfrompyfuncを使う方法があると思います。
が、型が混在する配列の場合はfrompyfunc一択のようです。

Python

1import numpy as np 2 3f = np.vectorize(lambda _a, _b: _a or _b) 4 5a = np.array([None, None, 1, 3]) 6b = np.array([True, 'hoge', 2, 0]) 7 8r = f(a,b) 9print(r) 10print([type(_r) for _r in r ]) 11 12f = np.frompyfunc(lambda _a, _b: _a or _b, 2, 1) 13r = f(a,b) 14 15print(r) 16print([type(_r) for _r in r])

result

1['True' 'hoge' '1' '3'] 2[<class 'numpy.str_'>, <class 'numpy.str_'>, <class 'numpy.str_'>, <class 'numpy.str_'>] 3['True' 'hoge' 1 3] 4[<class 'str'>, <class 'str'>, <class 'int'>, <class 'int'>]

参考記事:Python高速化実験~map関数とか~

投稿2019/09/21 00:04

編集2019/09/21 00:36
nomuken

総合スコア1627

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

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

siruku6

2019/09/21 00:13

>vectorizeかfrompyfunc どちらも初めて知りました! 試してみて、後ほど結果報告させていただきます。 ご紹介ありがとうございます。
siruku6

2019/09/21 05:10 編集

結果としては非常に高速で、単純にnumpyをloopした場合の約半分の時間で処理を行うことができました。 大変助かりました。ありがとうございました! ※補足ですが、`vetrorize`よりも`frompyfunc`の方が早かったです。 (質問内のソースコードで型を混在させたのは、どの型でも使用できる処理を知りたかったからであって、実際の処理では単一の型のみの使用でした)
siruku6

2019/09/22 02:35

今回教えていただいたようなメソッドはどうやって学ばれたのですか? 本やwebの解説サイトではなく、公式documentを検索されているのでしょうか?
nomuken

2019/09/22 03:13

いろんなキーワードでググって見つけました。今回の関数についてはきっかけは https://teratail.com/questions/209337 の質問で、配列の各要素を使って関数呼び出すを行うにはどうしたらよいかを考え 「Python 配列 各要素 関数」でググり、vectorizeを見つけました。 そして、使い方を確認するため「Python vectorize」で探して参考記事のサイトを見つけました。 ぷっちゃけるとまだPython初心者です。
siruku6

2019/09/22 08:28

まさかのweb検索でしたか! プログラミングの上達には検索スキルが必要だとよく先輩方に言われ、自分なりに頑張ったつもりでしたが、、まだまだでした。 私も頑張りたいと思います。 回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問