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

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

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

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

Python

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

Q&A

解決済

2回答

3866閲覧

Pythonで粒子の解析

crmy

総合スコア13

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2017/10/30 12:49

編集2017/10/30 13:03

Python初心者です。

100×100×500cmの箱があり、そこに以下のような座標を持つ10種類の粒子(ABCDE...)あったとします。

X Y Z

A 30.4 40.0 430.3
B 20.8 60.4 320.4
H 50.5 30.9 330.3
D 10.2 50.0 100.2
G 90.6 40.4 480.9
I    ・
H    ・    
C    ・  

行数は2万行ほどあり、表示される粒子の順番はランダムです。
上記のような座標を1セットとして、座標の違うものが10000セットほどあります。

そこでPythonを用いて、Z軸が05,1015,15~20cmのように0から50まで5cm刻みに距離をとったときその範囲に存在する粒子Aの数やBの数を数えるためにはどのようなプログラムを書けばいいのでしょうか?

最終的に10000セット分数えて、それらを平均した値を算出したいです。

まったくわからず困っています。

なにかアドバイスを頂けたら嬉しいです。
よろしくお願いします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2017/10/30 12:55

Excelなら列を選択してワークシート関数でさらっとカウントできますが、Pythonでないといけないのでしょうか?
crmy

2017/10/30 13:04

質問文に言葉足らずな部分がありましたので、追記しました。扱う行数が非常に多いのでpythonが適切かと思ったでのすが、excellでも扱えるものなのでしょうか。よろしくお願いします。
退会済みユーザー

退会済みユーザー

2017/10/30 14:32

古いエクセルだと65535行、新しいエクセルだと100万ちょいまで行けたと思います。多少重いかもしれませんが、Pythonを触ったことがないのでしたらExcelの方が楽だと思います。
guest

回答2

0

この手の処理を行うのでしたら、pandas をお勧めしておきます。

処理の仕方は以下のような感じ。
複雑なコードに見えるかもしれませんが、実際処理しているのは
データを分割している箇所とPivotテーブル作成の2行のみとシンプルに記述できます。

あと、データ生成部は、実際のコードではdf = pd.read_csv(...)に置き換わります。

Python

1import pandas as pd 2import numpy as np 3 4# ダミーデータ生成 5N = 10000 6df = pd.DataFrame({ 7 'Type': np.random.choice(('A','B','C','D','E','F','G','H','I','J'), N), 8 'X': np.random.uniform(0., 100., N), 9 'Y': np.random.uniform(0., 100., N), 10 'Z': np.random.uniform(0., 500., N) 11}) 12 13# 先頭を表示 14print(df.head()) 15# Type X Y Z 16# 0 I 7.451914 88.958929 141.680257 17# 1 F 15.252552 77.376957 366.378657 18# 2 H 49.445101 88.428184 23.725902 19# 3 A 7.169748 0.063047 451.124719 20# 4 J 33.558887 97.523463 97.186348 21 22# Z を 0~50 の範囲で 5 刻みで分割 23df['Range'] = pd.cut(x=df['Z'], bins=np.arange(0,55,5)) 24# カウントデータを縦軸を範囲、横軸をTypeとしてpovotテーブルで表示 25result = pd.pivot_table(df, columns='Type', index='Range', values='Z', aggfunc='count') 26print(result) 27# Type A B C D E F G H I J 28# Range 29# (0, 5] 16 13 6 7 6 7 8 5 9 9 30# (5, 10] 6 12 8 14 12 11 9 13 8 7 31# (10, 15] 12 10 8 10 12 8 7 12 11 11 32# (15, 20] 12 18 14 6 7 11 7 10 9 15 33# (20, 25] 15 11 9 12 7 11 6 12 6 14 34# (25, 30] 7 10 4 14 7 5 12 12 9 14 35# (30, 35] 15 15 8 5 8 9 11 4 10 12 36# (35, 40] 7 13 15 9 9 9 6 12 11 10 37# (40, 45] 11 6 14 3 11 10 6 11 11 9 38# (45, 50] 15 18 9 11 12 15 8 10 9 15

投稿2017/10/30 16:25

編集2017/10/30 23:12
magichan

総合スコア15898

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

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

0

ベストアンサー

試しに下記コードを書いてみました。

python

1import csv 2import math 3import collections 4 5TI = 0 # 粒子の種類のインデックス(左から0番目) 6ZI = 3 # Z軸座標のインデックス(左から3番目) 7ZMAX = 500 #cm 8ZSPLITWIDTH = 5 #cm 9 10# tsvファイルを開く 11tsvFile = open('data.tsv', 'r') 12tsv = csv.reader(tsvFile, delimiter = '\t') 13 14# カウンタ変数の配列数を計算 15n = int(ZMAX / ZSPLITWIDTH) 16# n個の辞書を初回アクセス時に0で初期化されるようにする 17particle_counter = [collections.defaultdict(int) for i in range(n)] 18 19# 粒子数を数える 20for data in tsv: 21 index = math.floor(float(data[ZI]) / ZSPLITWIDTH) 22 particle_counter[index][data[TI]] = particle_counter[index][data[TI]] + 1 23 24# 標準出力 25for i in range(n): 26 min = str(i * ZSPLITWIDTH) 27 max = str((i + 1) * ZSPLITWIDTH) 28 print("[" + min + "〜" + max + "]: " + str(dict(particle_counter[i])))

投稿2017/10/30 14:19

編集2017/10/31 13:15
K_S_

総合スコア419

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

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

karamarimo

2017/10/30 16:22

"data_list = list(tsv)" の1行は無い方が良いのではないでしょうか? そのまま "for data in tsv:" としてもうまくいくはずです。 リストに変換することで、ファイル全体のデータがまるごとメモリに取り込まれることになります。 もちろん今の場合2万行程度なのでメモリが尽きることはないと思いますが。
K_S_

2017/10/31 13:14

指摘ありがとうございます。おっしゃる通りですので、コードに反映させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問