Python

【Python】小数を連番|range関数・linspace等

  • このエントリーをはてなブックマークに追加
  • LINEで送る

Pythonで小数の連番方法で困っているあなたへ。

『range関数で小数の連番を作成できるの?』

『range関数以外で小数の連番を作成する方法は?』

こんな疑問に答えます。

SE歴25年のオッサンが解説するぞい!
SEおっさん
SEおっさん



スポンサーリンク

【Python】小数を連番する4つの方法

range関数は整数の連番を作成することは可能ですが、そのままでは小数の連番を作成できません。
少し、工夫が必要です。

今回は、小数の連番を作成する4つ方法をご紹介します。

小数の連番を作成する方法
  1. かけ算する:range関数の整数連番に小数を掛ける
  2. 自作する:小数を連番できる関数を自作する
  3. Numpyのarange関数を使用する
  4. Numpyのlinspace関数を使用する

①はrange関数で小数の連番を作成する方法です。
②~④はrange関数を使用せずに小数の連番を作成する方法です。

では、それぞれの方法を見ていきましょう!



スポンサーリンク

【Python】range関数の連番に小数を掛ける

rangeで作成した整数の連番に「小数を掛ける」ことで小数連番を作成できます。

~range関数の基本の使い方はこちら~
【Python】range関数の使い方!範囲・最後の判定・初期値など

range関数
  • 第1引数
    開始(start)…開始する値
  • 第2引数
    終了(stop)…終了する値
  • 第3引数
    間隔(step)…増える量  

例文を一緒に見ていこう!
0.0から0.9まで0.1刻みで表示するプログラムです。

for i in range(0, 10, 1):
    print(format(i*0.1, '.1f'))
0.0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
たろちゃん
たろちゃん
0から0.1刻みで小数の連番が作成されているね!

また、
リスト内包表記を使うと更に簡潔に書けます。

例文を一緒に見ていこう!
先ほどのプログラムをリスト内包表記で書いたプログラムです。

[format(i*0.1, '.1f') for i in range(10)]
['0.0', '0.1', '0.2', '0.3', '0.4', '0.5', '0.6', '0.7', '0.8', '0.9']
たろちゃん
たろちゃん
リストで小数の連番が作成されているね!
Q&A

Q:formatで’.1f’を指定してるのはナゼ?

A:浮動小数点数floatはコンピュータの内部では2進数で表現されているため、10進数の小数と厳密に同じ値を表現できないため、小数第1位で丸めています

詳しい説明はPythonの公式ドキュメントを参照。

formatで’.1f’を指定しないとこんな感じになります。

for i in range(0, 10, 1):
    print(i * 0.1)
0.0
0.1
0.2
0.30000000000000004
0.4
0.5
0.6000000000000001
0.7000000000000001
0.8
0.9
たろちゃん
たろちゃん
ホントだ!
ゴミみたいな誤差がでてるね
わかったかのぅ
SEおっさん
SEおっさん
【Python】range関数で1から連番・飛ばしの間隔・逆順など
【Python】range関数で1から連番・飛ばしの間隔・逆順など
Pythonのrange関数でチョットした応用をしたいあなたへ。 『1から連番にするには?』 『間隔を飛ばしで連番にするには?』 『逆順にどうやってするの?』 .....


スポンサーリンク

【Python】小数を連番できる関数を自作する

Python標準関数のrange関数は整数しか扱えません。

ならば、

range関数と同じような使い方で小数が使える関数を自作してしまおう。

というの考え方です。

早速、例文を見ていきましょう。
小数が使える自作関数float_rangeを定義したプログラムです。

def float_range(start, end, step):
    list = [start]
    n = start
    while n + step < end:
         n = n + step
         list.append(n)
    return list

自作関数float_rangeを呼び出し、小数の連番を作成します。

for i in float_range(0.0, 1.0, 0.1):
    print(format(i, '.1f'))
0.0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1.0
たろちゃん
たろちゃん
0から0.1刻みで小数の連番が作成されているね!
Q&A

Q:結果が0.9までじゃなく1.0までなのは?

A:誤差による影響で判定がうまく作動しなかったからです。

printで自作関数に誤差がわかるようにログを入れました

# 自作関数
def froat_range(start, end, step):
    list = [start]
    n = start
    while n + step < end:
         print('---------------------------')
         print('     n:',n)
         print('  step:', step)
         print('n+step:', n + step)
         print('   end:', end)

         n = n + step
         list.append(n)
    return list

# 自作関数をcall
froat_range(0.0, 1.0, 0.1)
---------------------------
     n: 0.0
  step: 0.1
n+step: 0.1
   end: 1.0
---------------------------
     n: 0.1
  step: 0.1
n+step: 0.2
   end: 1.0
---------------------------
     n: 0.2
  step: 0.1
n+step: 0.30000000000000004
   end: 1.0
---------------------------
     n: 0.30000000000000004
  step: 0.1
n+step: 0.4
   end: 1.0
---------------------------
     n: 0.4
  step: 0.1
n+step: 0.5
   end: 1.0
---------------------------
     n: 0.5
  step: 0.1
n+step: 0.6
   end: 1.0
---------------------------
     n: 0.6
  step: 0.1
n+step: 0.7
   end: 1.0
---------------------------
     n: 0.7
  step: 0.1
n+step: 0.7999999999999999
   end: 1.0
---------------------------
     n: 0.7999999999999999
  step: 0.1
n+step: 0.8999999999999999
   end: 1.0
---------------------------
     n: 0.8999999999999999
  step: 0.1
n+step: 0.9999999999999999
   end: 1.0

最後のn+stepとendがポイントです。
0.9999999999999999<1.0 となるので n+step<endが成立します。
これが結果が0.9までじゃなく1.0までとなった理由です。

プログラミング現場でも悩んだ時はログを入れて確認します。地道な努力ですが非常に大事なコトです♪

悩んだらログを入れよう!
SEおっさん
SEおっさん


スポンサーリンク

【Python】Numpyのarange関数を使用する

Numpyライブラリのarange関数で小数の数列を作れます。
使い方はrange関数と同じですが、Python標準ライブラリで無いためNumpyを個別インストールする必要があります。

arange関数の書式はこちら。
range関数と全く同じです。

arange関数
  • 第1引数
    開始(start)…開始する値
  • 第2引数
    終了(stop)…終了する値
  • 第3引数
    間隔(step)…増える量  

例文を一緒に見ていこう

import numpy as np
np.arange(0.0, 1.0, 0.1)
array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
たろちゃん
たろちゃん
0から0.1刻みで小数の連番が作成されているね!
Q&A

Q:結果がarrayになってるのは?

A:Numpyの配列の型はndarrayオブジェクトです。

arrayはNumpyのndarrayオブジェクトであることを表してます

Q:arange関数は誤差が無いの?

A:誤差はあります。次の例文をみてください。

import numpy as np
for x in np.arange(0,1,0.1):
    print(x)
0.0
0.1
0.2
0.30000000000000004
0.4
0.5
0.6000000000000001
0.7000000000000001
0.8
0.9

arrange関数でも、arange関数のように誤差は生じてますね。

Q:Numpyはどうやってインストールするの?

A:「pip install numpy」で簡単にインストールできます。

Numpyライブラリは標準関数ではないので基本的にはインストールが必要です。
anacondaでPython環境を構築した場合、Numpyはデフォルトでインストールされます。

わかったかのぅ
SEおっさん
SEおっさん
【Python】range関数の使い方!範囲・最後の判定・初期値など
【Python】range関数の使い方!範囲・最後の判定・初期値など
Pythonはrange関数で連番が作成できます。 でも… 『range関数の使い方は?』 『範囲を指定する方法は?』 『最後の判定はドコに境界があるの?』 『.....


スポンサーリンク

【Python】NumPyのlinspaceを使用する

NumPyライブラリのlinspaceを使用して小数の数列を作成できます。

linspace関数
  • 第1引数
    開始(start)
  • 第2引数
    終了(stop)
  • 第3引数
    要素数(num)

例文を一緒に見ていこう

import numpy as np
np.linspace(0, 1.0, 11)
array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
たろちゃん
たろちゃん
0から0.1刻みで小数の連番が作成されているね!
Q&A

Q:linspace関数は誤差が無いの?

A:誤差はあります。次の例文をみてください。

import numpy as np
for x in np.linspace(0, 1.0, 11):
    print(x)
0.0
0.1
0.2
0.30000000000000004
0.4
0.5
0.6000000000000001
0.7000000000000001
0.8
0.9
1.0

linspace関数でも小数の誤差は生じてますね。

わかったかのぅ
SEおっさん
SEおっさん

【Python】結局、小数の数列を扱うには何が一番いいの?

紹介した4つの方法で1番のおすすめは…

NumPyライブラリのlinspace関数を使用することです。

linspace関数は取得する個数(要素数)を指定すれば、STEPをいちいち計算して引数に設定しなくて良いからです。

【Python】小数を連番|range関数・linspace等 まとめ!

いかがでしたでしょうか?

小数の連番を作成する4つ方法をご紹介をご紹介しました。

振り返ってみましょう!

  1. かけ算する:range関数の整数連番に小数を掛ける
  2. 自作する:小数を連番できる関数を自作する
  3. Numpyのarange関数を使用する
  4. Numpyのlinspace関数を使用する

①はrange関数を使用した小数の連番
②~④はrange関数以外を使用した小数の連番

    range関数はPythonで初めから搭載されている組込関数。
    Numpyライブラリは手動でインストールして、モジュールをimportすると使用できる。

    ~range関数の基本の使い方はこちら~

    【Python】range関数の使い方!範囲・最後の判定・初期値など
    【Python】range関数の使い方!範囲・最後の判定・初期値など
    Pythonはrange関数で連番が作成できます。 でも… 『range関数の使い方は?』 『範囲を指定する方法は?』 『最後の判定はドコに境界があるの?』 『.....

     

    range関数を使うシーンはたくさんあります。
    特にfor文でカウントアップしながらループする処理は頻繁にみかけるでしょう。
    ループ処理について理解を深めるのも良いかもしれません。

    【Python】for文のインクリメントはrangeで変数にinする
    【Python】for文のインクリメントはrangeで変数にinする
    Pythonのfor文を使ってループしますが、 カウンタをインクリメントする方法が他言語と大きく異なります。 『for文でインデックスのインクリメント方法は?』.....
    フローチャートで簡単にループを抜ける方法!2つの図形と3つの判定
    フローチャートで簡単にループを抜ける方法!2つの図形と3つの判定
    フローチャートは、なんとな~くわかってきたけど… ループの抜け方がわからんゾ 『そもそもループの図形ってあるの?』 『終了条件は、どうやって書くの?』 フローチ.....

    また、
    range関数が扱えるのは整数のみです。
    小数の連番はNumpyモジュールのarange関数というものがサポートしています。

     

    リストや文字列もスライスやという方法で1つ飛ばし・逆順にできます。
    考え方は「range関数の1つ飛ばし・逆順」と同じです。
    ~リストや文字列をスライスで操作したい場合はこちら~

    【Python】スライスとは?リストや文字列を後ろから!飛ばしもOK♪
    【Python】スライスとは?リストや文字列を後ろから!飛ばしもOK♪
    Pythonでリストや文字列を操作できるスライスがあります。 スライスを使うとリストを後ろから逆順に取得したり、1つ飛ばしするのも自由自在。 だけど… 『そもそ.....

    ~リストをreverse・reversedで逆順にしたい場合はこちら~

    【Python】reverseとreversedの区別!リスト等
    【Python】reverseとreversedの区別!リスト等
    Pythonでリストとか逆順にしたいけど、reverseとreversedがいま一歩わからないあなたへ。 『reverseとreversedの区別・違いは?』 .....

     

    はい。今回は以上です。

    いかがでしたか?

    小数の連番は誤差があったり、ケッコー奥が深いですねぇ。
    一緒に楽しみながらプログラミングを頑張りましょー♪

    SEおっさん
    SEおっさん
    ここまで読んでくれてありがとう!

    「記事を読んでもわからないトコがある」「内容が変だよ」
    という時は、お気軽にコメントください♪

    「もっとSEおっさんに詳しく聞きたい。何かお願いしたい!」
    という時は、ココナラまで。メッセージもお気軽に♪

    LINEでのお問合わせも受付中!
    LINE公式アカウント

    メッセージをお待ちしています!

    取得資格
    • 応用情報技術者
    • Oracle Master Gold
    • Java SE Gold
    • Java EE Webコンポーネントディベロッパ
    • Python エンジニア認定データ分析
    • 簿記2級


    スポンサーリンク
    • このエントリーをはてなブックマークに追加
    • LINEで送る

    コメントを残す

    *