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

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

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

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

Q&A

解決済

2回答

2002閲覧

行列の各行ごとに順番に名前をつける

MOSMOS2

総合スコア20

Python 3.x

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

0グッド

0クリップ

投稿2018/09/15 13:55

今、下記のようなarrayがあります。

array([[ 0., 25., 50., 75., 100.],
[ 0., nan, nan, nan, nan],
[ 0., 30., 60., 90., nan],
[ 0., 150., 235., nan, nan]])

① これを以下のように格納したいと考えております。

  • 1行目から、variable1, 2, ...と名前をつけていきたい。
  • nan のところは削除して、左に詰めたい
  • 最終的には、これらを variables に格納したい。

variables = {'variable1': [0, 25, 50, 75, 100],
'variable2': [0],
'variable3': [0, 30, 60, 90],
'variable4': [0, 150, 235]
}

各行の要素は取れるのですが、これを順番に名前をつけて、variablesにまとめるところがよくわかりません。

よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

a.py

python3

1 2data = [ 3 [ 0., 25., 50., 75., 100.], 4 [ 0., None, None, None, None], 5 [ 0., 30., 60., 90., None], 6 [ 0., 150., 235., None, None] 7] 8 9print(data) 10print() 11 12datax = [ ["variablle{}".format(i + 1), [x for x in row if x is not None]] for i, row in enumerate(data)] 13print(datax)

実行例:
イメージ説明

追記:
結果を list でなく、 dict にしました。
pprint をつかって整形して表示するようにしました。

python3

1import pprint 2 3pp = pprint.PrettyPrinter(width=60, compact=True) 4 5data = [ 6 [ 0., 25., 50., 75., 100.], 7 [ 0., None, None, None, None], 8 [ 0., 30., 60., 90., None], 9 [ 0., 150., 235., None, None] 10] 11 12pp.pprint(data) 13print() 14 15print() 16datax_dic = { "variablle{}".format(i + 1): [x for x in row if x is not None] 17 for i, row in enumerate(data)} 18pp.pprint(datax_dic)

実行結果
イメージ説明

追記:
numpy を import して、 arraym nan をつかったデータにして、処理をしました。
nam かどうかの判定は isnan() を使います。
参考:
nanの入れ替えをしたい
noneとnumpy.nanの違い

python3

1import numpy as np 2import pprint 3 4pp = pprint.PrettyPrinter(width=60, compact=True) 5 6data = np.array([ 7 [ 0., 25., 50., 75., 100.], 8 [ 0., np.nan, np.nan, np.nan, np.nan], 9 [ 0., 30., 60., 90., np.nan], 10 [ 0., 150., 235., np.nan, np.nan] 11]) 12 13pp.pprint(data) 14print() 15 16print() 17datax_dic = { "variablle{}".format(i + 1): [x for x in row if not np.isnan(x)] 18 for i, row in enumerate(data)} 19pp.pprint(datax_dic)

実行例
イメージ説明

投稿2018/09/15 15:35

編集2018/09/16 08:22
katoy

総合スコア22324

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

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

MOSMOS2

2018/09/15 23:58

ありがとうございました。大変参考になりました。
guest

0

ベストアンサー

最終的には、これらを variables に格納したい。

variables = {'variable1': [0, 25, 50, 75, 100],

辞書型にしたいのだと思いましたので、@katoyさんの回答コードを参考にkeyリストvalueリストに分割してdict(zip())で辞書作成してみました。
もっとスマートに書けると思いますが処理過程がわかり易いので小分けしてみました。

-追記-
※nanを扱うにはnumpyのインストールとimportが必要です

Python3

1# coding=UTF-8 2 3import numpy as np 4from numpy import nan 5# nan = "nanてなんだろう" 6 7array = ([[ 0., 25., 50., 75., 100.], 8[ 0., nan, nan, nan, nan], 9[ 0., 30., 60., 90., nan], 10[ 0., 150., 235., nan, nan]]) 11 12list_key = ["variable{}".format(i + 1) for i,row in enumerate(array) ] 13print(list_key) 14 15list_val = [[x for x in row if x is not nan] for row in array] 16print(list_val) 17 18variables = dict(zip(list_key,list_val)) 19print(variables) 20 21print("variables = {") 22i=0 23for k, v in (sorted(variables.items())): 24 print("'" + str(k) + "':" + str(v) ,end="") 25 if i == len(variables)-1: 26 print("") 27 else: 28 print(",") 29 i+=1 30print("}") 31

出力結果

['variable1', 'variable2', 'variable3', 'variable4'] [[0.0, 25.0, 50.0, 75.0, 100.0], [0.0], [0.0, 30.0, 60.0, 90.0], [0.0, 150.0, 235.0]] {'variable1': [0.0, 25.0, 50.0, 75.0, 100.0], 'variable2': [0.0], 'variable3': [0.0, 30.0, 60.0, 90.0], 'variable4': [0.0, 150.0, 235.0]} variables = { 'variable1':[0.0, 25.0, 50.0, 75.0, 100.0], 'variable2':[0.0], 'variable3':[0.0, 30.0, 60.0, 90.0], 'variable4':[0.0, 150.0, 235.0] }

投稿2018/09/15 20:36

編集2018/09/16 01:20
opyon

総合スコア1009

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

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

MOSMOS2

2018/09/15 22:25

ありがとうございます!出力結果が {'variablle1': [0.0, 25.0, 50.0, 75.0, nan], 'variablle2': [0.0, nan, nan, nan, nan], 'variablle3': [0.0, 30.0, 60.0, 90.0, nan], 'variablle4': [0.0, 150.0, 235.0, nan, nan]} と、nanが残ってしまいます。 あとは print(variables)とした際に {'variable1': [0.0, 25.0, 50.0, 75.0, 100.0], 'variable2': [0.0], 'variable3': [0.0, 30.0, 60.0, 90.0], 'variable4': [0.0, 150.0, 235.0]} と改行して出力されれば嬉しいです。
opyon

2018/09/15 22:41

nanって変数ですか?もし変数で宣言されてるならis not Noneを修正すればいけるはずです。 出力の改行くらいはご自分で考えてみてください。 それだと人にはよっては「丸投げ=作業依頼」と受け取られ低評価に繋がるので今後のご質問では気をつけたほうが良いと思いますよ。
opyon

2018/09/15 23:22 編集

@katoyさんの回答コードを参考に、 Python学習3日目でとても良い例題として勉強になりました。 ありがとうございました。
MOSMOS2

2018/09/15 23:57

ありがとうございました。大変参考になりました!
LouiS0616

2018/09/16 00:33

nanは浮動小数型の定数です。 numpyならnp.isnanみたいな判定関数が用意されていたかと。
opyon

2018/09/16 00:47

そうだったのですね調べてみます。ありがとうございます。
opyon

2018/09/16 01:15

上記コードのままで、 import numpy as np from numpy import nan を追記するだけで変数を作らなくてもnanを識別出来ました。
MOSMOS2

2018/09/16 03:26 編集

ありがとうございます。以下でも取り除けました。 list_val = [[x for x in row if str(x) != 'nan'] for row in data] すごくいい感じだったのですが、辞書型なので、variable1, 10-19, 2, 20-29, 3, 31-39...で出力されるため(実際はvariableの数が多い)、今は、順番通りになるように検討しています。
MOSMOS2

2018/09/16 10:37

ありがとうございます。できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問