Pythonで小数の連番方法で困っているあなたへ。
『range関数で小数の連番を作成できるの?』
『range関数以外で小数の連番を作成する方法は?』
こんな疑問に答えます。
【Python】小数を連番する4つの方法
range関数は整数の連番を作成することは可能ですが、そのままでは小数の連番を作成できません。
少し、工夫が必要です。
今回は、小数の連番を作成する4つ方法をご紹介します。
- かけ算する:range関数の整数連番に小数を掛ける
- 自作する:小数を連番できる関数を自作する
- Numpyのarange関数を使用する
- Numpyのlinspace関数を使用する
①はrange関数で小数の連番を作成する方法です。
②~④はrange関数を使用せずに小数の連番を作成する方法です。
では、それぞれの方法を見ていきましょう!
【Python】range関数の連番に小数を掛ける
rangeで作成した整数の連番に「小数を掛ける」ことで小数連番を作成できます。
~range関数の基本の使い方はこちら~
【Python】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
また、
リスト内包表記を使うと更に簡潔に書けます。
例文を一緒に見ていこう!
先ほどのプログラムをリスト内包表記で書いたプログラムです。
[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: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
ゴミみたいな誤差がでてるね
【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
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までとなった理由です。
プログラミング現場でも悩んだ時はログを入れて確認します。地道な努力ですが非常に大事なコトです♪
【Python】Numpyのarange関数を使用する
Numpyライブラリのarange関数で小数の数列を作れます。
使い方はrange関数と同じですが、Python標準ライブラリで無いためNumpyを個別インストールする必要があります。
arange関数の書式はこちら。
range関数と全く同じです。
- 第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])
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はデフォルトでインストールされます。
【Python】NumPyのlinspaceを使用する
NumPyライブラリの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])
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関数でも小数の誤差は生じてますね。
【Python】結局、小数の数列を扱うには何が一番いいの?
紹介した4つの方法で1番のおすすめは…
NumPyライブラリのlinspace関数を使用することです。
linspace関数は取得する個数(要素数)を指定すれば、STEPをいちいち計算して引数に設定しなくて良いからです。
【Python】小数を連番|range関数・linspace等 まとめ!
いかがでしたでしょうか?
小数の連番を作成する4つ方法をご紹介をご紹介しました。
振り返ってみましょう!
- かけ算する:range関数の整数連番に小数を掛ける
- 自作する:小数を連番できる関数を自作する
- Numpyのarange関数を使用する
- Numpyのlinspace関数を使用する
①はrange関数を使用した小数の連番
②~④はrange関数以外を使用した小数の連番
range関数はPythonで初めから搭載されている組込関数。
Numpyライブラリは手動でインストールして、モジュールをimportすると使用できる。
~range関数の基本の使い方はこちら~
range関数を使うシーンはたくさんあります。
特にfor文でカウントアップしながらループする処理は頻繁にみかけるでしょう。
ループ処理について理解を深めるのも良いかもしれません。
また、
range関数が扱えるのは整数のみです。
小数の連番はNumpyモジュールのarange関数というものがサポートしています。
リストや文字列もスライスやという方法で1つ飛ばし・逆順にできます。
考え方は「range関数の1つ飛ばし・逆順」と同じです。
~リストや文字列をスライスで操作したい場合はこちら~
~リストをreverse・reversedで逆順にしたい場合はこちら~
はい。今回は以上です。
いかがでしたか?
小数の連番は誤差があったり、ケッコー奥が深いですねぇ。
一緒に楽しみながらプログラミングを頑張りましょー♪
「記事を読んでもわからないトコがある」「内容が変だよ」
という時は、お気軽にコメントください♪
「もっとSEおっさんに詳しく聞きたい。何かお願いしたい!」
という時は、ココナラまで。メッセージもお気軽に♪
LINEでのお問合わせも受付中!
LINE公式アカウント
メッセージをお待ちしています!
- 応用情報技術者
- Oracle Master Gold
- Java SE Gold
- Java EE Webコンポーネントディベロッパ
- Python エンジニア認定データ分析
- 簿記2級