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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Network+

Network+とは、IT業界団体CompTIA認定のネットワーク技術に関する知識を証明する資格です。ネットワーク技術者として、実務で必要なネットワークセキュリティ・ネットワークアーキテクチャなどの知識を取得している証明となります。

Python 3.x

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

Q&A

解決済

2回答

7365閲覧

TypeError: 'generator' object is not subscriptable

Hayato1201

総合スコア220

Network+

Network+とは、IT業界団体CompTIA認定のネットワーク技術に関する知識を証明する資格です。ネットワーク技術者として、実務で必要なネットワークセキュリティ・ネットワークアーキテクチャなどの知識を取得している証明となります。

Python 3.x

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

0グッド

0クリップ

投稿2018/06/27 09:07

編集2018/06/27 09:53

以下の様なコードでTypeError: 'generator' object is not subscriptableというエラーが出ました。

Python

1import networkx as nx 2 3all_shortest = nx.all_pairs_dijkstra_path(self.graph) 4 5 for s in range(self.ACTIVE_NODES): 6 for d in range(self.ACTIVE_NODES): 7 if s != d: 8 next = all_shortest[s][d][1] #ここでTypeError: 'generator' object is not subscriptable 9 port = self.ports[s][next] 10 routing_nodes[s][d] = next 11 routing_ports[s][d] = port 12 else: 13 routing_nodes[s][d] = -1 14 routing_ports[s][d] = -1

ある論文に載っていたプログラムです。その為動くとは思うのですがエラーが出ているという事は何かしら環境に問題があると思います。他の部分でnetworkxのバージョンの違いによるエラーがあったので、これもnx.all_pairs_dijkstra_path(self.graph)の戻り値であるall_shortestに何か問題があるのでは無いかと思います。しかしそもそもこのエラーはどういう事なのでしょうか?

追記ーーーーーーーーーーーーーーーーーー

以下の様にしました。
すると今度は別の場所でValueError: setting an array element with a sequence.となります、、、

Python

1import networkx as nx 2 3routing_nodes = np.full([self.ACTIVE_NODES]*2, -1.0, dtype=int) 4 5all_shortest = list(nx.all_pairs_dijkstra_path(self.graph)) 6 7 for s in range(self.ACTIVE_NODES): 8 for d in range(self.ACTIVE_NODES): 9 if s != d: 10 next = all_shortest[s][d][1] 11 port = self.ports[s][next] 12 routing_nodes[s][d] = next #ここでValueError: setting an array element with a sequence. 13 routing_ports[s][d] = port 14 else: 15 routing_nodes[s][d] = -1 16 routing_ports[s][d] = -1 17

今度はどういう事でしょうか?

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

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

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

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

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

LouiS0616

2018/06/27 09:24

単にall_shortest[0]と書いたときにエラーは出ますか。
Hayato1201

2018/06/27 09:33

next = all_shortest[0] TypeError: 'generator' object is not subscriptableと同じエラーが出ました。。。
guest

回答2

0

値をリストからジェネレータに置き換えることで、効率化を図っているようです。
その一方で、インデックスを指定してランダムアクセスすることができなくなるのです。

単に現状のコードを動かしたいのなら、次のように修正してみてください。

Python

1all_shortest = list(nx.all_pairs_dijkstra_path(self.graph))

投稿2018/06/27 09:37

LouiS0616

総合スコア35660

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

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

Hayato1201

2018/06/27 09:47

回答ありがとうございます! all_shortest = list(nx.all_pairs_dijkstra_path(self.graph))で行ったところすぐ後に別のエラーが出てしまいました。。。その部分を追記致しました
guest

0

ベストアンサー

変数保持のデフォルトの挙動が変わったので、リスト化してみてください。

python

1a=list(range(5)) 2print(a[0]) 3a=range(5) 4print(a[0]) #error

スライスをとって代入してください。

python

1>>> import numpy as np 2>>> a = np.zeros((10,10)) 3>>> a 4array([[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 5 [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 6 [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 7 [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 8 [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 9 [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 10 [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 11 [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 12 [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 13 [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]]) 14>>> b = np.ones((2,2)) 15>>> b 16array([[ 1., 1.], 17 [ 1., 1.]]) 18>>> a[1:3, 1:3] = b 19>>> a 20array([[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 21 [ 0., 1., 1., 0., 0., 0., 0., 0., 0., 0.], 22 [ 0., 1., 1., 0., 0., 0., 0., 0., 0., 0.], 23 [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 24 [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 25 [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 26 [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 27 [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 28 [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 29 [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])

投稿2018/06/27 09:36

編集2018/06/27 12:06
mkgrei

総合スコア8560

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

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

mkgrei

2018/06/27 09:38 編集

最後prontになってません? 編集するとprint(a[0])なんだが…
LouiS0616

2018/06/27 09:40

なってます。テキトーに編集するとおおかた直ります。 それこそ 一文字入れて ⇒ それを消す みたいな編集でも大丈夫だったはず。
Hayato1201

2018/06/27 09:40

回答ありがとうございます!変数保持のデフォルトの挙動が変わったのはnetworkxの話ですよね?
mkgrei

2018/06/27 09:42

python2→python3の話です。 networkxが実装を変えたのかどうかはログを見ないと。
mkgrei

2018/06/27 09:43

1空行追加しました、スッキリ。 dbと表示がずれるの気になります。
Hayato1201

2018/06/27 09:50

了解です!ただ、all_shortest = list(nx.all_pairs_dijkstra_path(self.graph))でリスト化するとまたその先でエラーが出てしまいました・・・その点追記しました!
mkgrei

2018/06/27 10:20

listからさらにnp.arrayにキャストしてみてください。 それ以前にやろうとしていることが誤っている可能性があります。
Hayato1201

2018/06/27 11:56

さらにnp.arrayにキャストという事はrouting_nodes[s][d] = np.array(next)この様にするという事ですよね?するとやはり同じ様にValueError: setting an array element with a sequence.となってしまいます。。。何度もすみませんがお分かりになりますでしょうか?
mkgrei

2018/06/27 12:07

routing_nodes[s][d]は数、np.array(next)は配列なのでエラーになります。 np.array(next)と同じ次元だけrouting_nodes[s][d]を取り出す必要がありますが、 それがそもそもやりたいことなのか疑問があります。
Hayato1201

2018/06/27 13:35

結局やりたいことが不明だった為、networkxのバージョンを下げてnx.all_pairs_dijkstra_pathの戻り値を比較した所ディクショナリ型だった為、リスト型ではなくディクショナリ型でキャストしたところ、ここのエラーは無くなりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問