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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

7781閲覧

指定した範囲の数値の数え方

crmy

総合スコア13

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2017/07/07 11:02

Python超初心者です。

ランダムな文字数が並ぶテキスト(数字の範囲は0~100)
14.2
0.1
95.3
45.6



89.6
といった数値が約1000万行ほどあります。

このテキストから、00.1,0.10.2,0.20.3・・・99.9100
といった具合に0.1刻みずつの範囲内にある数値の個数を数えるプログラムとして
以下のようなものを書きました。

import sys
import numpy as np
input_file=[]

input_file_name = sys.argv[1]

with open(input_file_name, 'r') as f:
for line in f:
items = line.split()
input_file.append(float(items[0]))

a = np.arange(0,100,0.1)
b = np.arange(0.1,100.1,0.1)

for i,j in zip(a,b):
print(i,j)

print(sum(i<X<=j for X in input_file))

しかし、このプログラムだと計算を行うのに非常に時間がかかってしまい、
一時間ほど待っても出力されませんでした。
おそらくループ回数が多すぎることが原因だと思います。

そこで、もうすこし早く計算が進むようなプログラムを書きたいのですが、
なかなか思いつきません。

どのようなプログラムがいいのか、ご指導していただけませんでしょうか?
よろしくお願いします。

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

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

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

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

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

guest

回答3

0

こうですかね

ret = [0] * 1001 for i in np.floor(input_file * 10): ret[int(i)] += 1 with open('result.txt', 'w') as f: for (i, v) in enumerate(ret): f.write("{} {}\n".format(i / 10, v))

投稿2017/07/07 15:59

what_alnk

総合スコア147

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

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

0

pandasを使うのは駄目でしょうか?

100万行程度であれば数秒で終わります

Python

1import pandas as pd 2import numpy as np 3 4# データ読み込み 5df = pd.read_csv('data.csv',header=None, names=['data']) 6# 0~100 までを 0.1 STEPでの範囲でデータをカウント 7hist = df['data'].value_counts(bins=[i for i in np.arange(0.,100.1,0.1)]) 8# 結果をCSVに書き出す 9hist.sort_index().to_csv('hist.csv') 10# 一応トータルを計算 11print(hist.sum()) 12# 統計量を表示 13print(hist.describe())

一応、データを生成したコードも添付しておきます
(一様分布で100万個の乱数を生成)

Python

1import pandas as pd 2import numpy as np 3 4df = pd.DataFrame({'data':np.random.uniform(0,100,1000000)}) 5df.to_csv('data.csv',header=None,index=None)

投稿2017/07/07 11:48

magichan

総合スコア15898

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

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

0

ベストアンサー

まあこれが限界でしょうね。
これ以上速くしたいならデータなりを工夫するしかありません。

python

1dic = {str(i/10):0 for i in range(1,1001)} 2for num in f: 3 dic[str(int(float(num)*10)/10)] += 1 4for k,v in dic.items(): 5 print(str(int(k)-0.1),k) 6 print(v)

投稿2017/07/07 11:19

編集2017/07/12 06:05
_Victorique__

総合スコア1392

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

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

crmy

2017/07/12 03:11

解答ありがとうございます。 3行目の意味がよくわからないのですが、教えていただけませんか?
crmy

2017/07/12 03:24

ありがとうございます。 3行目の意味がよくわからないのですが、教えていただけませんか?
_Victorique__

2017/07/12 03:37

それぞれの範囲の辞書を作って初期化しています。 ファイルを読み込んだ時にその数字をkeyとしてインクリメントすることで出現回数をカウントすることができます。
crmy

2017/07/12 04:16

大変、申し訳ないのですが、もう少し詳しく教えていただけないでしょうか。すみません。
_Victorique__

2017/07/12 04:53

何がわからないのかが分かりません。辞書が分からないのかそれとも辞書を使って何をしているのかが分からないのか、どちらですか?
crmy

2017/07/12 05:10

辞書を使って何をしているのかが分からないです。 教えていただいたことを参考にコードを書きました input_file_name = sys.argv[1] input_file = open( input_file_name , "r" ) f = input_file.read() dic = {str(i/10):0 for i in range(1,1001)} for num in f: dic[num] += 1 for k,v in dic.items(): print(str(int(k)-0.1),k) print(v) しかし、dic[num]+= 1の部分でKey errorが出てしまいます。
_Victorique__

2017/07/12 05:19

質問からファイル内の数字は小数点一桁以外に存在するか読み取れませんがどういった前提ですか?
crmy

2017/07/12 05:31

実際に読み込んでいるファイルでは、 37.49074 33.82048 23.64274 29.28317 ・ ・ ・ の大きさの数字が約1000万行あります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問