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

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

ただいまの
回答率

90.52%

  • Python

    7953questions

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

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

解決済

回答 3

投稿 編集

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

yohehe

score 19

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

例えば

import numpy as np

a=np.arange(200)
#わざとshapeを変更しています。
a=a.reshape(1,200,1)

#aから50個取り出すとすると、以下でアクセス
b=a[,0:49,]
#200のデータにアクセスして5をかけてlistとしてcに格納したいとすると
c=[d[,:,]*5 for d in a]
SyntaxError: invalid syntax
コード


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

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

追記

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

#dataはlist形式です。predictにかけるためにreshapeを行います。
suitei=np.array(data)
suitei_len=len(suitei)
#分類器にかけられるshapeが(1,5,1)のため、shapeを変更する。
suitei=np.array(data).reshape(1,suitei_len,1)
suitei.shape
#この時点でarrayは(1,143,1)です。

#このデータの末尾5つを分類器に格納していき50回の次点でのデータを予測したいとすると

yosou_data=[]
for i in range(50):
    temp_data=suitei[:,-5:,:]
    temp_data=np.array(temp_data).reshape(1,5,1)
#predictを適応するためには、(1,5,1)のarrayである必要。
    temp_yosou=model.predict(temp_data)
    print(temp_yosou)      
    print(np.array(temp_yosou).shape)
    temp_yosou=np.array(temp_yosou).reshape(1,1,1)
#もとのsuiteiのshapeに戻してhstackで最後尾のデータとして格納。そのデータからまた末尾5個を取り出してpredictを行いたい。
    yosou_data.append(temp_yosou)
    temp_suitei=np.hstack((suitei,temp_yosou))
    suitei=temp_suitei
    print(temp_suitei.shape)
    print(temp_suitei[:,-1,:])

コード


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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • LouiS0616

    2018/07/15 19:14

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

    キャンセル

  • LouiS0616

    2018/07/15 19:14

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

    キャンセル

  • yohehe

    2018/07/15 19:37

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

    キャンセル

回答 3

+2

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

import numpy as np
a = np.random.randn(20).reshape(1,20,1)
print(a)
b = a[0,:,0]
print(b)
print(b.shape)
b[0] = 0
print(b)
print(a)


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

「200のデータにアクセスして5をかけてlistとしてcに格納したい」

目的の処理を実現するコードは以下のようになります。
リスト内包表記の中でnumpy配列を使うのは面倒なので、最後に.tolistでリストにするのがよいでしょう。

import numpy as np
a = np.arange(20).reshape(1,20,1) # 分かりやすいよう20の連番で
print(a)

a[0,:,0] = a[0,:,0]*5 # 1次元目のみを5倍に
print(a)

# 1次元目のみをリストに
c = a[0,:,0].tolist()
print(c)

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/15 19:43

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

    繰り返内包表記という表記では意図が伝わらないのですか。勉強になります、修正いたします。

    キャンセル

  • 2018/07/15 20:07

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

    キャンセル

  • 2018/07/15 20:17

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

    キャンセル

checkベストアンサー

+1

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

for _ in range(50):
    suitei = np.hstack(
        (suitei, model.predict(suitei[:, -5:, :]))
    )

yosou_data = suitei[:,-50:,:]

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/15 20:10

    LouiS0616様、感謝いたします。

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

    キャンセル

+1

基本に忠実に。

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

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


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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/15 19:58

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

    キャンセル

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

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

関連した質問

  • 解決済

    ソート結果が正しくない

    前提・実現したいこと csvファイルdata1.csvおよびそれと同じフォーマットのcsvファイルdata2.csv, csvファイルdata3.csvのそれぞれに対して,温度(

  • 受付中

    関数の実装、matmulを利用

    追記:print(np.matmul(A, x)) まではできたのですが、それ以降はどのように書けば良いでしょうか?

  • 解決済

    pythonのプログラムの高速化

    pythonのプログラムなのですが、処理にかかる時間が長く困っています。改善策があれば教えてください。 m2 = np.empty((0,80)) for x in m:

  • 解決済

    Tensorflowのfully_connected_feedの実行にエラーが続く

    tensoflowのfully_connected_feed.pyを実行しようとしているのですが、どう試行錯誤してもエラーが続きます。 tensorflowのインストールの仕方、

  • 受付中

    python(predict)の使い方に関して

    前提・実現したいこと ここに質問したいことを詳細に書いてください (例)PHP(CakePHP)で●●なシステムを作っています。 ■■な機能を実装中に以下のエラーメッセージが発生し

  • 解決済

    pythonのリストに付いての質問

    pythonのリストに付いての質問です。 文字列が1500個入っているリストがあります。先頭から0,1番目をそれぞれ変数x,yに入れていき2番めを抜かして3,4をx,yに追加。5を

  • 解決済

    二つの配列で重複した内容を取り出したい

     前提・実現したいこと a = [1,3,6,14,30,53,103,106] b = [2,3,7,30,32,64,103,111,200,204] という2つの配列a・b

  • 解決済

    構造の異なる辞書をソートしたい

    構造の異なる辞書をソートしたい。 辞書dfには df = [{"A":{"A1":{"a1":100,"b1":200,"c1":300}}},{"B":{"B1":{"a2"

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

  • Python

    7953questions

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

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