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

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

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

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

Q&A

1回答

482閲覧

Pythonでアニメーションを実装したい

56530

総合スコア0

Python 3.x

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

0グッド

0クリップ

投稿2022/07/17 12:29

Cat Swarm Intelligenceという、郡知能の機械学習を勉強しております。以下のサイト
3D 散布図を回転 GIF アニメーションにする
https://qiita.com/hoto17296/items/a72e29c5c3b0e49d42fd

にて、2つのモード、Seeking Mode、Tracing Modeの状態をそれぞれアニメーションで実装しようかと考えましたが、

Traceback (most recent call last):
File "/Users/Newton/Desktop/CSO/cso.py", line 173, in <module>
main()
File "/Users/Newton/Desktop/CSO/cso.py", line 129, in main
ax.scatter(best_cat[:,0],best_cat[:,1],best_cat[:,2],color='blue')
IndexError: too many indices for array: array is 1-dimensional, but 2 were indexed

と出てしまいます。

コメントアウトした部分がアニメーションのコードなのですが、どう修正すればいいのか、どなたかご助力いただけないでしょうか。

よろしくお願いします。

from nis import cat import numpy as np import random import matplotlib.pyplot as plt import matplotlib.animation as ani from mpl_toolkits.mplot3d import Axes3D from io import BytesIO from PIL import Image def sphere(x): #-5~5 val = 0 for i in range(len(x)): val += x[i]**2 return val def rastrigin(x): #-5~5 val = 10*len(x) for i in range(len(x)): val += x[i]**2 - 10*np.cos(2*np.pi*x[i]) return val def rosenbrock(x): #-5~10 val = 0 for i in range(len(x)-1): val += 100*(x[i+1] - x[i]**2)**2 + (1 - x[i])**2 return val def griewank(x): #-600~600 val = 1 val1 = 0 val2 = 1 for i in range(len(x)): val1 += x[i]**2 / 4000 val2 *= np.cos(x[i] / np.sqrt(i+1)) return val + val1 - val2 def alpine(x): #-10~10 val = 0 for i in range(len(x)): val += abs((x[i]*np.sin(x[i]) + 0.1*x[i])) return val def minima(x): #-5~5 Styblinski-Tang function val = 0 for i in range(len(x)): val += x[i]**4 - 16*x[i]**2 + 5*x[i] / 2 # return val + len(x)*78.3327 return val def main(): N = 200 n_itr = 1000 MR = 0.2 SMP = 5 SRD = 1 CDC = 0.2 c1 = 1 dim = 3 v_max = 1 x_min = -5 x_max = 10 objective = rosenbrock cats = np.array([[random.uniform(x_min, x_max) for _ in range(dim)] for _ in range(N)]) velocities = np.zeros(cats.shape) modes = [np.random.choice([0, 1], 1, p=[1-MR, MR])[0] for _ in range(N)] fitness = np.apply_along_axis(objective, 1, cats) best_fitness = min(fitness) best_cat = cats[np.argmin(fitness)] step = [0] result = [best_fitness] # figure fig = plt.figure(figsize=(8,6)) imgs= [] for n in range(n_itr): for i in range(N): if modes[i] == 0: #seeking mode candidates = [] if fitness[i] == best_fitness: #SPC is True n_candidates = SMP-1 candidates.append(np.copy(cats[i])) else: # SPC is False n_candidates = SMP for _ in range(n_candidates): change_d = np.random.choice(dim, int(dim*(1-CDC)), replace=False) add = np.copy(cats[i]) for d in change_d: r = random.uniform(-1, 1) add[d] = add[d] + r*SRD*add[d] candidates.append(add) fit_vals = [objective(cand) for cand in candidates] fit_max = max(fit_vals) fit_min = min(fit_vals) if fit_max == fit_min: #candidatesのfitnessが全部等しい時 cats[i] = candidates[0] else: differences = [abs(fit_max-val) for val in fit_vals] sum_diff = sum(differences) probs = [diff/sum_diff for diff in differences] cats[i] = candidates[np.random.choice(SMP, 1, p=probs)[0]] else: #tracing mode r1 = random.uniform(0, 1) v = np.copy(velocities[i]) for d in range(dim): v[d] = v[d] + r1*c1*(np.copy(best_cat)[d] - np.copy(cats[i])[d]) v[d] = min(v[d], v_max) v[d] = max(v[d], -v_max) cats[i][d] = cats[i][d] + v[d] velocities[i][d] = v[d] # create images fig.clear() ax = fig.add_subplot(111,projection='3d') ax.scatter(best_cat[:,0],best_cat[:,1],best_cat[:,2],color='blue') ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_zlabel('Z') ax.set_xlim(-1.5,1.5) ax.set_ylim(-1.5,1.5) ax.set_zlim(-1.5,1.5) fig.text(0,0,'t={:6}'.format(t)) buf = BytesIO() fig.savefig(buf) imgs.append(Image.open(buf)) fitness = np.apply_along_axis(objective, 1, cats) modes = [np.random.choice([0, 1], 1, p=[1-MR, MR])[0] for _ in range(N)] if best_fitness > min(fitness): best_fitness = min(fitness) best_cat = np.copy(cats[np.argmin(fitness)]) if (n+1)%100 == 0: step.append(n+1) result.append(best_fitness) print('##### result #####') print('best: ') print(best_fitness) print('position: ') print(best_cat) print('##################') print(list(result)) print('###################') imgs[0].save('output.gif',save_all=True,append_images=imgs[1:],duration=100,loop=0) plt.plot(step, result) ax = plt.gca() ax.set_yscale('log') plt.title('rosenbrock') plt.xlabel('step') plt.ylabel('result') plt.show() if __name__ == '__main__': main()

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

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

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

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

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

melian

2022/07/17 12:38

> IndexError: too many indices for array: array is 1-dimensional, but 2 were indexed なので、以下の様にするのでしょう、おそらく。 ax.scatter(best_cat[:,0],best_cat[:,1],best_cat[:,2],color='blue') => ax.scatter(*best_cat,color='blue')
guest

回答1

0

単純にエラーを見ると、1次元配列だけど、2次元配列みたいに指定していますよというエラーですね。
best_catが2次元配列かどうか確認ください

投稿2022/07/17 12:33

East_san

総合スコア407

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問