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

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

ただいまの
回答率

90.61%

  • Python

    7515questions

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

複数行列への分割について

解決済

回答 2

投稿

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

susum

score 6

Pythonによる複数行列の解析に関する質問です。
4行n列の.txtファイルを読み込んで分割を行いたいと考えています。
txtファイルは下記のような内容です。

531 1 1 20
532 1 1 24
533 1 1 28
531 1 2 21
532 1 2 24
533 1 2 29
531 1 3 21
532 1 3 23
533 1 3 27
......
531 1 11 20
531 1 11 25
531 1 11 28

c, r = A.shapeにより行列を読み込むことはできたのですが、
3段ずつ分割といった、段数指定をせずに3列目の数値の変化ごとに行列を分割したいと考えています。

最終的には分割した行列を平均して1列目と4列目のプロットや
分割した行列の4列目の最大値を横軸3列目でプロットしたいと考えています。

発生している問題・エラーメッセージ

該当のソースコード

import numpy as np
import matplotlib.pyplot as plt

fname = "/Users//abc.txt"

A = np.loadtxt(fname)
c, r = A.shape

B =np.split(A, [1,3]) 

plt.figure()
plt.plot(B[:,0],B[:,3])

試したこと

段数を指定することによる分割は行いました。
1つ1つ調べなければならないので時間がかかります。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

+2

もっとスマートにやる方法がある気がしますが... とりあえずこれで。

import numpy as np

def find_border(row_array):
    row_array_a = np.append(row_array.copy(), -1)
    row_array_b = np.append(-1, row_array.copy())
    return np.arange(row_array.size+1)[row_array_a != row_array_b]

def find_horizon(dim2_array, key_index):
    key_row = dim2_array[:, key_index]
    return find_border(key_row)

def main():
    A = np.loadtxt('nptext.txt')
    horizon = find_horizon(A, 2)

    for i in range(1, len(horizon)):
        print(A[horizon[i-1]:horizon[i]])

if __name__ == '__main__':
    main()

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/08 16:00

    回答ありがとうございます。
    早速、pythonに入れてみました。
    プロットしようと思い
    plt.figure()
    plt.plot(A[horizon[:,2]:horizon[:,3]])
    NameError: name 'horizon' is not defined
    となりました。horizonに格納されているわけではないのでしょうか?
    勉強不足であると思うのでもう一度やってみます。

    キャンセル

  • 2017/09/08 16:24

    not definedですか...
    タイポか、スコープの違いのような気がします。
    問題の個所を見てみないとなんとも言えないです。

    キャンセル

checkベストアンサー

+1

Pandasを使うという選択肢はありですかね?
この手の処理はPandasを使うほうが楽です。

import pandas as pd
import numpy as np

# データ読み込み
fname = "/Users//abc.txt"
df = pd.read_csv(fname, sep=' ', header=None)
# 3列目の値でグループ分け
grp = df.groupby(2)
# 全てのグループをnumpy配列で表示
for col2_val, grouped_df in grp:
    print(grouped_df.as_matrix())

【補足】

import matplotlib.pyplot as plt
# テーブル全体の基本統計量を表示
print(df.describe())
# テーブル全体の積算を表示
print(df.sum())
# グループ毎の積算を表示
print(grp.sum())
# グループ毎の平均を表示
print(grp.mean())
# グループよりcol2が7のグループを取得
grp7_df = grp.get_group(7)
# 上記のグループ(col2=7)をx軸(col0),y軸(col3)でプロット
grp7_df.plot(kind='scatter', x=0,y=3)
plt.show()

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/08 16:11

    回答ありがとうございます。
    txtをcsvで読み込む方法があることを初めて知りました。

    df = pd.read_csv(fname, sep=' ', header=None)
    この文で「# 3行目の値でグループ分け」できる理由がわかりません。
    csv形式の仕様でしょうか?

    とりあえず、csvへの読み込みを勉強しようと思います。

    キャンセル

  • 2017/09/08 18:53 編集

    pandasは表計算を行うためのライブラリです。
    df = pd.read_csv(fname, sep=' ', header=None)
    は単純に、データを2次元のテーブルとして読み込んだだけです。
    で、グループ分けをしているのは次の
    grp = df.groupby(2)
    の部分で、これが3列目(index=2)の値によってグループを分けなさい。という指示になります。
    で次からのループで、上記で分けたグループ毎にテーブルを読み込んで、as_matrix() でnumpy配列に変換しております。

    キャンセル

  • 2017/09/12 13:56

    回答ありがとうございます。
    pandasによる分割やグループ分けについて構文は理解できました。
    分割した各行列をプロットすることもできたのですが、
    grp.plot(0,3)
    ではx,y軸の指定はできても指定した行列のプロットができません。
    以前、grp[1,10].plot(0,3)のように[ , ]で指定することでプロットしたい順番の行列をプロットできた気がしたのですが出来ませんでした。

    指定グループの表示や全グループの積算は可能でしょうか?

    キャンセル

  • 2017/09/12 14:31

    基本的にやりたいことは可能かと思いますが、具体的にどのような処理を行いたいのかの詳細がわからないので回答にサンプルを追加しました。
    参考にしてください

    キャンセル

  • 2017/09/12 14:35

    ありがとうございます!

    キャンセル

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

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

関連した質問

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

  • Python

    7515questions

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