Pythonでsqrtを扱う方法とは?ルートを計算するためのsqrt関数の使用方法について紹介!

- システム
エンジニア - Pythonでsqrtをどう使うか教えてください。
- プロジェクト
マネージャー - はい。ルートを計算するためのsqrt関数の使い方についてご紹介しましょう。
Pythonでsqrt関数を使って、ルートを計算する4つの方法
Pythonのsqrt関数を使ってルートを計算する方法として、mathモジュール、numpyモジュール、sympyモジュール、scipyモジュールを紹介します。実際にPythonのソースコードを書きながら確認していきましょう。
mathモジュールのsqrt関数を使って、ルートを計算する方法
Pythonの標準ライブラリに含まれているmathモジュールは、以下のように書いてルートを計算します。
1
2
3
4
5
|
>>> import math
>>> math.sqrt(4)
2.0
|
この例では、まずmathモジュールをimportしています。それからsqrt関数を呼び出して、4を引数としてわたしています。その結果として、2.0が返されていることがわかります。
また、mathモジュールのsqrt関数に配列や負数の引数をわたすとエラーとなってしまうので注意しましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
>>> math.sqrt([4,4,4])
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-42-6b045bca6cbe> in <module>()
----> 1 math.sqrt([4,4,4])
TypeError: must be real number, not list
>>> math.sqrt(-4)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-43-5c74ec90b955> in <module>()
----> 1 math.sqrt(-4)
ValueError: math domain error
|
numpyモジュールのsqrt関数を使って、ルートを計算する方法
Pythonの外部ライブラリに含まれているnumpyモジュールの使用方法は、mathモジュールと同じです。以下のように書いて、ルートを計算します。
1
2
3
|
>>> import numpy
>>> numpy.sqrt(9)
3.0
|
また、numpyモジュールのsqrt関数では、mathモジュールとは異なり、配列や負数を引数としてわたすことができます。
1
2
3
4
|
>>> numpy.sqrt([9,8,7])
array([3. , 2.82842712, 2.64575131])
>>> numpy.sqrt(-9)
nan
|
この例では、配列[9,8,7]を引数としてわたすと、各要素に対してルートが計算され、配列型で返されていることがわかります。また、負数-9を引数としてわたした場合は、nanが返されています。
sympyモジュールのsqrt関数を使って、ルートを計算する方法
Pythonの外部ライブラリに含まれているsympyモジュールの使用方法も、mathモジュールと同じです。以下のように書いて、ルートを計算します。
1
2
3
|
>>> import sympy
>>> sympy.sqrt(16)
4
|
ここでmathモジュールやnumpyモジュールと異なる点は、小数点以下が表示されていないということです。別の例もあわせて確認してみましょう。
1
2
3
4
|
>>> sympy.sqrt(5)
sqrt(5)
>>> sympy.sqrt(12)
2*sqrt(3)
|
これまでmathモジュールやnumpyモジュールのsqrt関数でルート計算で割り切れない場合、無限小数が返されていました。ですが、sympyモジュールでは無理数として返すという特徴があります。
また、sympyモジュールは、負数を引数としてわたすと虚数単位をつけて結果を返します。
1
2
3
4
5
6
|
>>> sympy.sqrt(-16)
4*I
>>> sympy.sqrt(-5)
sqrt(5)*I
>>> sympy.sqrt(-12)
2*sqrt(3)*I
|
配列を引数としてわたした場合は、mathモジュールと同様にエラーとなります。
scipyモジュールのsqrt関数を使って、ルートを計算する方法
Pythonの外部ライブラリに含まれているscipyモジュールの使用方法は、mathモジュールと同じです。以下のように書いて、ルートを計算します。
1
2
3
|
>>> import scipy
>>> scipy.sqrt(25)
5.0
|
また、scipyモジュールは、配列と負数のルート計算ができます。
1
2
3
4
|
>>> scipy.sqrt([5,4,3])
array([2.23606798, 2. , 1.73205081])
>>> scipy.sqrt(-25)
5j
|
ここで、負数計算の結果にsympyモジュールと違いがあります。それは、scipyモジュールの虚数単位がjとなっていることです。
Pythonでsqrtを使わずに、ルートを計算する2つの方法
Pythonでは、べき乗計算をするための算術演算子である**や組み込み関数pow()を使って、ルートを求めることができます。
算術演算子**を使って、ルートを計算する方法
以下のように書いて、ルートを計算します。
1
2
|
>>> 36**0.5
6.0
|
36をルート計算(0.5乗)した結果である6.0が返されてることがわかります。また、負数を引数としてわたした場合は、複素数の形式で結果を返します。
1
2
|
>>> (-36)**0.5
(3.6739403974420594e-16+6j)
|
配列を引数としてわたした場合は、エラーとなります。
1
2
3
4
5
6
|
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-47-1c1310f61441> in <module>()
----> 1 [1,2,3]**0.5
TypeError: unsupported operand type(s) for ** or pow(): 'list' and 'float'
|
組み込み関数pow()を使って、ルートを計算する方法
以下のように書いて、ルートを計算します。
1
2
|
>>> pow(49, 0.5)
7.0
|
49をルート計算(0.5乗)した結果である7.0が返されてることがわかります。また、負数を引数としてわたした場合は、算術演算子**と同様に複素数の形式で結果を返します。
1
2
|
>>> pow(-49, 0.5)
(4.286263797015736e-16+7j)
|
配列を引数としてわたした場合は、エラーとなります。
それぞれのルート計算方法の違いは?
Pythonにおける、sqrt関数を使った4つのルート計算方法と、sqrt関数を使わない2つのルート計算方法を紹介しました。それぞれの計算手法において、算出できる引数のデータ型や、戻り値の形式に違いが見られました。
それらを以下の表に整理しました。なお、横列は引数のデータ型、縦列は使用モジュール、○×は計算が可能かどうかを表しています。()内は戻り値の形式を表しており、()がない場合は浮動小数点型が戻り値となっています。
正数 | 負数 | 配列 | |
---|---|---|---|
math | 〇 | × | × |
numpy | 〇 | 〇(nan) | 〇 |
sympy | 〇(整数 or 無理数) | 〇(*I) | × |
scipy | 〇 | 〇(j) | 〇 |
** | 〇 | 〇(複素数) | × |
pow() | 〇 | 〇(複素数) | × |
計算速度の測定
いくつかの計算方法がある場合、計算速度は選択の指標になります。以下の表にテストプログラムの実行時間をまとめました。
計算速度は環境によって変わりますので、この記事の結果は目安としてください。なお、テストプログラムではルート計算を10000*7回実行しています。結果には10000回のルート計算にかかった時間の平均が表示されています。
測定結果を確認すると、正数のルート計算はmathモジュールや、算術演算子**がより高速だとわかります。
負数のルート計算は、モジュールによって計算結果の形式が異なりますが、形式は問わないのであれば算術演算子**を使う方法が高速だとわかります。
配列の計算ができるモジュールはnumpyかscipyのみですが、今回のテストで用いた程度の配列であれば、numpyがより高速だとわかります。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
>>> # テストプログラム
>>> import math
>>> import numpy
>>> import sympy
>>> import scipy
>>> # 正数
>>> n = 12345678910
>>> %timeit -n 10000 math.sqrt(n)
>>> %timeit -n 10000 numpy.sqrt(n)
>>> %timeit -n 10000 sympy.sqrt(n)
>>> %timeit -n 10000 scipy.sqrt(n)
>>> %timeit -n 10000 n ** 0.5
>>> %timeit -n 10000 pow(n,0.5)
485 ns ± 107 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
2.01 µs ± 556 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
3.16 µs ± 429 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
21.2 µs ± 1.35 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
324 ns ± 8.65 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
538 ns ± 55.6 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
>>> # 負数
>>> n = -12345678910
>>> %timeit -n 10000 numpy.sqrt(n)
>>> %timeit -n 10000 sympy.sqrt(n)
>>> %timeit -n 10000 scipy.sqrt(n)
>>> %timeit -n 10000 n ** 0.5
>>> %timeit -n 10000 pow(n,0.5)
6.38 µs ± 860 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
2.54 µs ± 316 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
21.9 µs ± 549 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
556 ns ± 12.6 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
616 ns ± 23.6 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
>>> # 配列
>>> n = [
>>> [12345678910,12345678910,12345678910],
>>> [12345678910,12345678910,12345678910],
>>> [12345678910,12345678910,12345678910]
>>> ]
>>> %timeit -n 10000 numpy.sqrt(n)
>>> %timeit -n 10000 scipy.sqrt(n)
10.5 µs ± 1.81 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
27.1 µs ± 519 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
|
正数 | 負数 | 配列 | |
---|---|---|---|
math | 485 ns | - | - |
numpy | 2.01 µs | 6.38 µs | 10.5 µs |
sympy | 3.16 µs | 2.54 µs | - |
scipy | 21.2 µs | 21.9 µs | 27.1 µs |
** | 324 ns | 556 ns | - |
pow() | 538 ns | 616 ns | - |
- システム
エンジニア - Pythonでsqrt関数を使ったルートの計算方法、よく分かりました。
- プロジェクト
マネージャー - Pythonでsqrt関数を使った計算可能な引数や実行速度についてもご参考にしてください。
まとめ
いかがでしたでしょうか。Pythonでは、ルートを計算するためのsqrt関数が、標準ライブラリや外部ライブラリにいくつも用意されています。この記事ではそのうち4つの使用方法を紹介しました。また、sqrt関数を使用しないルート計算の方法も2つ紹介しました。
sqrt関数の引数には注意が必要です。使用するモジュールごとに、エラーにならない引数をわたしているか確認しましょう。また、計算結果の形式がモジュールごとに異なることもあります。返してほしい形式にあわせて、使用するモジュールを選択しましょう。
ぜひご自身でソースコードを書いて、動作を確認してみてください。実行速度が意識できると、より高速なプログラムの開発に役立ちます。また、エラーメッセージも含めて確認しておくと、今後の開発で同様のエラーメッセージを見たときのヒントになります。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


Python新着案件New Job
-
マルチロガーソフト開発/東京都豊島区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都豊島区(池袋駅) -
マルチロガーソフト開発/東京都豊島区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都豊島区(池袋駅) -
商品化予定の振動センサーの運用保守/Python/東京都都内/【WEB面談可】
月給50万~60万円東京都都内(-駅) -
商品化予定の振動センサーの可視化UI開発のテスター/Python/東京都都内/【WEB面談可】
月給25万~35万円東京都都内(-駅) -
商品化予定の振動センサーの運用保守/Python/東京都都内/【WEB面談可】
月給50万~60万円東京都都内(-駅) -
商品化予定の振動センサーの可視化UI開発のテスター/Python/東京都都内/【WEB面談可】
月給25万~35万円東京都都内(-駅)