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

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

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

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

Q&A

解決済

3回答

385閲覧

(1,200,1)の次元の際からデータを取り出す手法について。[d[0] for d in data]やlambdaなどでデータを取り出していくことは可能でしょうか。

yohehe

総合スコア48

Python

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

0グッド

0クリップ

投稿2018/07/15 09:42

編集2018/07/15 10:47

array shapeが(1,200,1)の3次元のデータshapeからデータが格納されている次元にアクセスする内包表記の書き方がわかりません。
deeplearningなどで特徴量などを編集したい場合にshapeが3次元になるっている場合が多々ありますので、プログラムをまとめたいと考えております。
現在はreshape(),reshape(-1)などで途中途中で次元の削減などを何度か行うことでプログラミングをしているのですが、内包表記などでの対応が可能かどうか勉強しております。

例えば

python

1import numpy as np 2 3a=np.arange(200) 4#わざとshapeを変更しています。 5a=a.reshape(1,200,1) 6 7#aから50個取り出すとすると、以下でアクセス 8b=a[,0:49,] 9#200のデータにアクセスして5をかけてlistとしてcに格納したいとすると 10c=[d[,:,]*5 for d in a] 11SyntaxError: invalid syntax 12コード

(1,200,1)などの3次元のデータの際の内包表記はどのようにアクセスすればよろしいでしょうか?
色々とためしているのですが、d[]の部分の記載方法がわからないです。

初歩的な問題ですが、よろしくお願い致します。

追記

具体的にはRNNを利用した数値予測のプログラム作成の勉強をしております。
必要があれば全てのプログラムを追記いたしますが、RNNでLSTMを使用してmodel.fitした分類器を作成したところまでは省略ています。

python

1#dataはlist形式です。predictにかけるためにreshapeを行います。 2suitei=np.array(data) 3suitei_len=len(suitei) 4#分類器にかけられるshapeが(1,5,1)のため、shapeを変更する。 5suitei=np.array(data).reshape(1,suitei_len,1) 6suitei.shape 7#この時点でarrayは(1,143,1)です。 8 9#このデータの末尾5つを分類器に格納していき50回の次点でのデータを予測したいとすると 10 11yosou_data=[] 12for i in range(50): 13 temp_data=suitei[:,-5:,:] 14 temp_data=np.array(temp_data).reshape(1,5,1) 15#predictを適応するためには、(1,5,1)のarrayである必要。 16 temp_yosou=model.predict(temp_data) 17 print(temp_yosou) 18 print(np.array(temp_yosou).shape) 19 temp_yosou=np.array(temp_yosou).reshape(1,1,1) 20#もとのsuiteiのshapeに戻してhstackで最後尾のデータとして格納。そのデータからまた末尾5個を取り出してpredictを行いたい。 21 yosou_data.append(temp_yosou) 22 temp_suitei=np.hstack((suitei,temp_yosou)) 23 suitei=temp_suitei 24 print(temp_suitei.shape) 25 print(temp_suitei[:,-1,:]) 26 27コード

今のところこのようにreshapeを多数かけて形式を変えながらデータをpredictと格納を繰り返している状態です。
プログラミング初心者で内包表記でもっと簡易な記載方法があればと思い、検討しているのですが。

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

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

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

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

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

LouiS0616

2018/07/15 10:14

具体的にどのような結果が得られることを期待しているのでしょうか。
LouiS0616

2018/07/15 10:14

乱数を使ってしまうと面倒ですので、仮に a = np.arange(200) とした場合について追記してください。
yohehe

2018/07/15 10:37

louis0616様、返信ありがとうございます。この問題で解決したい具体的な内容について記載いたしました。
guest

回答3

0

おそらくやりたいことはスライシングではないかと思います。配列の任意の部分にアクセスできます。
参考:NumPy配列のスライシング機能の使い方

Python

1import numpy as np 2a = np.random.randn(20).reshape(1,20,1) 3print(a) 4b = a[0,:,0] 5print(b) 6print(b.shape) 7b[0] = 0 8print(b) 9print(a)

ちなみに質問文中の内包表記という言葉は、リストや辞書など一連のデータを生成する処理を指すので、ちょっと他人には意図が伝わりづらいのでご注意ください。

####「200のデータにアクセスして5をかけてlistとしてcに格納したい」
目的の処理を実現するコードは以下のようになります。
リスト内包表記の中でnumpy配列を使うのは面倒なので、最後に.tolistでリストにするのがよいでしょう。

Python

1import numpy as np 2a = np.arange(20).reshape(1,20,1) # 分かりやすいよう20の連番で 3print(a) 4 5a[0,:,0] = a[0,:,0]*5 # 1次元目のみを5倍に 6print(a) 7 8# 1次元目のみをリストに 9c = a[0,:,0].tolist() 10print(c)

投稿2018/07/15 10:24

編集2018/07/15 10:54
can110

総合スコア38234

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

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

yohehe

2018/07/15 10:43

can110様、ありがとうございます。スライジングの問題だとは思うのですが、[d[0] for d in data]などの記載方法で、修正依頼がありまして追記させていただきました内容につきまして、reshapeではない方法でアクセスできないかを検討しておりました 繰り返内包表記という表記では意図が伝わらないのですか。勉強になります、修正いたします。
can110

2018/07/15 11:07

回答修正しました。エラー原因についてはそもそも「d[,:,]」という書き方で発生しています。 また、RNNコードはちゃんと理解できていませんが、他の方も指摘されているようにこの場合はreshapeやリストへの変換は必要ないように思えます。
yohehe

2018/07/15 11:17

can様、スライジングの手法について勉強になりました。 今の課題だとreshapeやリスト化を行う方法がベストではないようでした。 組み合わせ方でこれほど差がでるものなのですね。ありがとうございます。
guest

0

ベストアンサー

全体的にreshapeは不要なんじゃないかと思いました。
途中の出力を飛ばせば、次のコードで事足りるのでは。

Python

1for _ in range(50): 2 suitei = np.hstack( 3 (suitei, model.predict(suitei[:, -5:, :])) 4 ) 5 6yosou_data = suitei[:,-50:,:]

投稿2018/07/15 10:51

LouiS0616

総合スコア35658

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

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

yohehe

2018/07/15 11:10

LouiS0616様、感謝いたします。 [d for d in data]のようなやり方でプログラムを修正しようとかんがえていたのですが、現在と同じ方法でこれほど記載の方法で差ができるものなのですね。驚きました。ありがとうございます。 プログラムの表記を修正してみます。
guest

0

基本に忠実に。

python

1lst = [x[0] for x in a[0]]

パフォーマンス面でのメリットは恐らくないし、そもそもreshapeしたくない事情が思いつかないのですが・・・


b=a[,0:49,]がそもそも間違ってる・・・

投稿2018/07/15 10:50

hayataka2049

総合スコア30933

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

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

yohehe

2018/07/15 10:58

hayataka様、ありがとうございます。[d[] for d in data]などの表記を用いればシンプルに記載が可能と色々と調べて行っていたところ混乱しておりました。 reshapeを繰り返し用いても[d for d in data]などの表記を用いたとしてもパフォーマンスにおいてメリットはほとんどないのですね。基本に忠実がやはり重要だと学びました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問