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

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

ただいまの
回答率

91.37%

  • Python 3.x

    2394questions

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

pythonでのRuntimeError

解決済

回答 1

投稿 2017/11/24 15:08 ・編集 2017/11/24 15:15

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

ruuruusann24

score 3

度々すみません
これの最後のshow_volonoi_with_metrics(dist.euclidean)でエラーが出てしまいます。
なにか良い方法はありますでしょうか

以下エラーです

RuntimeError                              Traceback (most recent call last)
<ipython-input-62-670a63d7ce7e> in <module>()
----> 1 show_volonoi_with_metrics(dist.euclidean)

<ipython-input-61-e1fd4304de1a> in show_volonoi_with_metrics(metrics)
15         xs = map(lambda p: p[0], cluster_points)
16         ys = map(lambda p: p[1], cluster_points)
---> 17         ax.scatter(xs, ys, color=cm.prism(i / float(len(c_means))), marker='.')
18 
19     ax.scatter(map(lambda p: p[0], c_means), map(lambda p: p[1], c_means), color="g", marker='o')

~/anaconda3/envs/styletrans/lib/python3.6/site-packages/matplotlib/init.py in inner(ax, *args, kwargs) 1708                     warnings.warn(msg % (label_namer, func.name), 1709                                   RuntimeWarning, stacklevel=2) -> 1710             return func(ax, *args, kwargs)
1711         pre_doc = inner.doc
1712         if pre_doc is None:

~/anaconda3/envs/styletrans/lib/python3.6/site-packages/matplotlib/axes/_axes.py in scatter(self, x, y, s, c, marker, cmap, norm, vmin, vmax, alpha, linewidths, verts, edgecolors, **kwargs)
4007             edgecolors = 'face'
4008 
-> 4009         self._process_unit_info(xdata=x, ydata=y, kwargs=kwargs)
4010         x = self.convert_xunits(x)
4011         y = self.convert_yunits(y)

~/anaconda3/envs/styletrans/lib/python3.6/site-packages/matplotlib/axes/_base.py in _process_unit_info(self, xdata, ydata, kwargs)
1967             # we only need to update if there is nothing set yet.
1968             if not self.xaxis.have_units():
-> 1969                 self.xaxis.update_units(xdata)
1970 
1971         if ydata is not None:

~/anaconda3/envs/styletrans/lib/python3.6/site-packages/matplotlib/axis.py in update_units(self, data)
1430         """
1431 
-> 1432         converter = munits.registry.get_converter(data)
1433         if converter is None:
1434             return False

~/anaconda3/envs/styletrans/lib/python3.6/site-packages/matplotlib/units.py in get_converter(self, x)
160         if converter is None:
161             try:
--> 162                 thisx = safe_first_element(x)
163             except (TypeError, StopIteration):
164                 pass

~/anaconda3/envs/styletrans/lib/python3.6/site-packages/matplotlib/cbook/init.py in safe_first_element(obj)
2310         except TypeError:
2311             pass
-> 2312         raise RuntimeError("matplotlib does not support generators "
2313                            "as input")
2314     return next(iter(obj))

RuntimeError: matplotlib does not support generators as input

以下コードです

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import scipy.spatial.distance as dist
%matplotlib inline

def label_cluster_num(means, mesh_points, metrics):
def label(point):
cluster_label = np.argmin(map(lambda mean: metrics(mean, point), means))
return point, cluster_label
return map(label, mesh_points)

c_means = np.array([[1, 2], [-3, 4], [-5, -6], [7, -8]])
xs = np.linspace(-10, 10, 100)
ys = np.linspace(-10, 10, 100)
xx, yy = np.meshgrid(xs, ys)
mesh_points = np.c_[xx.ravel(), yy.ravel()]

def show_volonoi_with_metrics(metrics):
labeled_mesh_points = label_cluster_num(c_means, mesh_points, metrics=metrics)
plt.figure()
fig, ax = plt.subplots()

ax.set_aspect('equal')
ax.grid(True, which='both')
ax.axhline(y=0, color='k')
ax.axvline(x=0, color='k')
ax.set_xlim([-10, 10])
ax.set_ylim([-10, 10])

for i in range(0, len(c_means)):
cluster_points = map(lambda p, label: p, filter(lambda p, label: label == i, labeled_mesh_points))
xs = map(lambda p: p[0], cluster_points)
ys = map(lambda p: p[1], cluster_points)
ax.scatter(xs, ys, color=cm.prism(i / float(len(c_means))), marker='.')

ax.scatter(map(lambda p: p[0], c_means), map(lambda p: p[1], c_means), color="g", marker='o')

plt.show()

show_volonoi_with_metrics(dist.euclidean)

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • mkgrei

    2017/11/24 15:13

    高度の嫌がらせですか…RuntimeErrorの詳細がないと、手元で実行しないとデバッグは無理ですよ。

    キャンセル

  • LouiS0616

    2017/11/24 15:36

    ネットで拾ってきたコードを、ろくに調べず/考えず動かそうとして失敗するのは当たり前です。拾い食いして腹を壊すようなものです。

    キャンセル

回答 1

checkベストアンサー

+1

仮説ですが、オリジナルのコードはPython2.xでmapがlistを返していたのです。
そして今、Python3.xを使っているせいで、mapがイテレータを返してきているので、matplotlibは困惑している状況です。

すべてのmap(...)をlist(map(...))のようにlistで囲むと解決する可能性が高いです。


追記
古いlambda関数の挙動を初めて知りました。
簡潔な解決法はpython2.xを使用することでした。

以下にpython3.xで動くコードを載せます。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import scipy.spatial.distance as dist
%matplotlib inline

def label_cluster_num(means, mesh_points, metrics):
    def label(point):
        cluster_label = np.argmin(list(map(lambda mean: metrics(mean, point), means)))
        return point, cluster_label
    return list(map(label, mesh_points))

c_means = np.array([[1, 2], [-3, 4], [-5, -6], [7, -8]])
xs = np.linspace(-10, 10, 100)
ys = np.linspace(-10, 10, 100)
xx, yy = np.meshgrid(xs, ys)
mesh_points = np.c_[xx.ravel(), yy.ravel()]

def show_volonoi_with_metrics(metrics):
    labeled_mesh_points = label_cluster_num(c_means, mesh_points, metrics=metrics)
    plt.figure()
    fig, ax = plt.subplots()

    ax.set_aspect('equal')
    ax.grid(True, which='both')
    ax.axhline(y=0, color='k')
    ax.axvline(x=0, color='k')
    ax.set_xlim([-10, 10])
    ax.set_ylim([-10, 10])

    for i in range(0, len(c_means)):
        cluster_points = list(map(lambda p: p[0], filter(lambda p: p[1] == i, labeled_mesh_points)))
        xs = list(map(lambda p: p[0], cluster_points))
        ys = list(map(lambda p: p[1], cluster_points))
        ax.scatter(xs, ys, color=cm.prism(i / float(len(c_means))), marker='.')

    ax.scatter(list(map(lambda p: p[0], c_means)), list(map(lambda p: p[1], c_means)), color="g", marker='o')

    plt.show()

show_volonoi_with_metrics(dist.euclidean)

読みやすいバージョン

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import scipy.spatial.distance as dist
%matplotlib inline

def label_cluster_num(means, mesh_points, metrics):
    def label(point):
        cluster_label = np.argmin([metrics(p, point) for p in means])
        return cluster_label
    return np.array([label(p) for p in mesh_points])

c_means = np.array([[1, 2], [-3, 4], [-5, -6], [7, -8]])
xs = np.linspace(-10, 10, 100)
ys = np.linspace(-10, 10, 100)
xx, yy = np.meshgrid(xs, ys)
mesh_points = np.c_[xx.ravel(), yy.ravel()]

def show_volonoi_with_metrics(metrics):
    labels = label_cluster_num(c_means, mesh_points, metrics=metrics)
    fig, ax = plt.subplots()

    ax.set_aspect('equal')
    ax.grid(True, which='both')
    ax.axhline(y=0, color='k')
    ax.axvline(x=0, color='k')
    ax.set_xlim([-10, 10])
    ax.set_ylim([-10, 10])

    for i in range(0, len(c_means)):
        cluster_points = mesh_points[labels==i]
        xs = cluster_points[:, 0]
        ys = cluster_points[:, 1]
        ax.scatter(xs, ys, color=cm.prism(i / float(len(c_means))), marker='.')

    ax.scatter(c_means[:, 0], c_means[:, 0], color="g", marker='o')

    plt.show()

show_volonoi_with_metrics(dist.euclidean)

投稿 2017/11/24 15:29

編集 2017/11/24 15:38

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/11/24 15:42

    コピー元のサイトに『環境:python: anaconda-4.0.0』って書いてあるあたりお察しですね。
    動けばいい類のコードみたいです。

    キャンセル

  • 2017/11/24 15:44

    ありがとうございます!無事解決しました!今後ともよろしくお願いします!

    キャンセル

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

ただいまの回答率

91.37%

関連した質問

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

  • Python 3.x

    2394questions

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