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

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

ただいまの
回答率

91.02%

  • Python

    5540questions

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

  • Python 3.x

    4089questions

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

Pythonで粒子の解析

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 306

crmy

score 7

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軸が0~5,10~15,15~20cmのように0から50まで5cm刻みに距離をとったときその範囲に存在する粒子Aの数やBの数を数えるためにはどのようなプログラムを書けばいいのでしょうか?

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2017/10/30 21:55

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

    キャンセル

  • crmy

    2017/10/30 22:04

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

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2017/10/30 23:32

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

    キャンセル

回答 2

+2

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

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

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

import pandas as pd
import numpy as np

# ダミーデータ生成
N = 10000
df = pd.DataFrame({
    'Type': np.random.choice(('A','B','C','D','E','F','G','H','I','J'), N),
    'X': np.random.uniform(0., 100., N),
    'Y': np.random.uniform(0., 100., N),
    'Z': np.random.uniform(0., 500., N)
})

# 先頭を表示
print(df.head())
#   Type          X          Y           Z
# 0    I   7.451914  88.958929  141.680257
# 1    F  15.252552  77.376957  366.378657
# 2    H  49.445101  88.428184   23.725902
# 3    A   7.169748   0.063047  451.124719
# 4    J  33.558887  97.523463   97.186348

# Z を 0~50 の範囲で 5 刻みで分割
df['Range'] = pd.cut(x=df['Z'], bins=np.arange(0,55,5))
# カウントデータを縦軸を範囲、横軸をTypeとしてpovotテーブルで表示
result = pd.pivot_table(df, columns='Type', index='Range', values='Z', aggfunc='count')
print(result)
# Type       A   B   C   D   E   F   G   H   I   J
# Range
# (0, 5]    16  13   6   7   6   7   8   5   9   9
# (5, 10]    6  12   8  14  12  11   9  13   8   7
# (10, 15]  12  10   8  10  12   8   7  12  11  11
# (15, 20]  12  18  14   6   7  11   7  10   9  15
# (20, 25]  15  11   9  12   7  11   6  12   6  14
# (25, 30]   7  10   4  14   7   5  12  12   9  14
# (30, 35]  15  15   8   5   8   9  11   4  10  12
# (35, 40]   7  13  15   9   9   9   6  12  11  10
# (40, 45]  11   6  14   3  11  10   6  11  11   9
# (45, 50]  15  18   9  11  12  15   8  10   9  15

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

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

import csv
import math
import collections

TI = 0 # 粒子の種類のインデックス(左から0番目)
ZI = 3 # Z軸座標のインデックス(左から3番目)
ZMAX = 500 #cm
ZSPLITWIDTH = 5 #cm

# tsvファイルを開く
tsvFile = open('data.tsv', 'r')
tsv = csv.reader(tsvFile, delimiter = '\t')

# カウンタ変数の配列数を計算
n = int(ZMAX / ZSPLITWIDTH)
# n個の辞書を初回アクセス時に0で初期化されるようにする
particle_counter = [collections.defaultdict(int) for i in range(n)] 

# 粒子数を数える
for data in tsv:
    index = math.floor(float(data[ZI]) / ZSPLITWIDTH)
    particle_counter[index][data[TI]] = particle_counter[index][data[TI]] + 1

# 標準出力
for i in range(n):
    min = str(i * ZSPLITWIDTH)
    max = str((i + 1) * ZSPLITWIDTH)
    print("[" + min + "〜" + max + "]: " + str(dict(particle_counter[i])))

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/31 01:22

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

    キャンセル

  • 2017/10/31 22:14

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

    キャンセル

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

  • ただいまの回答率 91.02%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    1957年京都大学の入試問題について

    a,b,c,d,e,fをいずれも0から9までの数字とする。 6桁の整数abcdefを適当に定めて、その2倍がcdefabとなるようにせよ。 ここにabcdefは、通常の十進法による

  • 解決済

    要素比較の高速化について

    二つのファイルの要素を比較しています. ファイルAはとにかく大きい(10GB前後),ファイルBは400件程度の要素が存在します. Aには要素の被りがありますが,Bにはありません.

  • 解決済

    Pythonでの質問

    かなり初歩的に質問になってしまうのですが y = [0.0] * len(x) このような分に例えばxに100が入っていたとしてyは何になるのでしょうか どのような理

  • 解決済

    pythonでの日数計算について

    pythonでの日数計算についてですが、 a = 20160212 b = datetime.date(int(2015),int(10),int(14).strftime("

  • 解決済

    setメソッドを使用する時

    setメソッドが重複する要素は取り除く役割を持っていることはわかります。 でも、ならsetメソッドを使う時は何個かある要素の重複する要素を取り除きたい時のみで、 他はほとんど配列・

  • 解決済

    cifa10のバイナリデータ形式について

    cifar10はpythonバージョンとバイナリデータ版のファイルがダウンロードできます。 バイナリデータの形式は <1 x label><3072 x pixel> ...

  • 解決済

    pythonで時間の引き算を行う

    python3.5を使っているプログラミング初心者です。  いつもお世話になっております。 位置情報の変化から物体の速度を算出するプログラムを作っています。 入力するCSVファ

  • 解決済

    数字と英文字が混ざっているリストのソート

    list1=[['100','banana','3'], ['10000','sasa','21'], ['99','apple','645'], ...             

同じタグがついた質問を見る

  • Python

    5540questions

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

  • Python 3.x

    4089questions

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