
前提・実現したいこと
Python3.6.8にて、Numpy配列内に円形に多数の(一定の)値をセットしたいのですが、上手くいきません。
発生している問題・エラーメッセージ
以下の図は現時点でセットした値を、散布図に色を付けるという形で表したものです。
200x200のセル配置において、端から20セルずつ離してランダムに円形に並べたいと考えており、そのようにコードを書いたのですが、想定外の部分にも値がセットされてしまいます。
(下の図において、小さい円は本来私がセットしたかったもので、上部と下部の長方形及び中部にある横一列の赤色の部分の配置をなくしたいです)
該当のソースコード
以下はソースコードです。
上の図にはgazを示しています。
全範囲に配置(端から20セルと散乱体の半径分あけて)
の行から
抽出した配列に1以外の要素があるなら処理をスキップ
の部分までが、値を円の形にセットする部分です。
python3.6
1#!/usr/bin/env python 2# -*- coding: utf-8 -*- 3 4""" 5fd2d 散乱体の配置設定用 6""" 7 8from os import get_terminal_size 9import numpy as np 10import scipy.constants as sc 11from math import e, pi, sin, sqrt, ceil 12from tqdm import tqdm 13from matplotlib import pyplot as plt 14 15import fd2d_init_value as fi 16 17 18# 初期値からgazをimport 19gaz_n = fi.gaz 20gbz_n = fi.gbz 21 22# 誘電体のパラメータ設定 23epsr = 30 24sigma= -0.01 25radius= 2.5 26epsz = 8.854e-12 27 28# 散乱体が発生する確率を決める(p分の1) 29p = 200 30 31# 全範囲に配置(端から20セルと散乱体の半径分あけて) 32for j in tqdm( range(ceil(radius) + 20, fi.je - ceil(radius) - 20) ): 33 for i in range( ceil(radius) + 20, fi.ie - ceil(radius) - 20): 34 35 # Numpy配列から散乱体を置く(かもしれない)範囲を抽出 36 sample_array = gaz_n[i-ceil(radius):i+ceil(radius),j-ceil(radius):j+ceil(radius)] 37 38 # 抽出した配列に1以外の要素がないかチェック 39 if np.any(sample_array != 1) == False: 40 41 # p面のサイコロを作る 42 dice = list(range(1, p)) 43 44 # サイコロを振って、1の目が出たときだけ(=1/pの確率で)処理を実行 45 if np.random.choice(dice) == 1: 46 for k in range(j-ceil(radius), j+ceil(radius)): 47 for l in range(i-ceil(radius), i+ceil(radius)): 48 xdist = (l - i) 49 ydist = (k - j) 50 dist= sqrt(xdist ** 2 + ydist ** 2) 51 if dist <= radius: 52 gaz_n[l, k] = 1 / (epsr + (sigma * fi.dt / epsz)) 53 gbz_n[l, k] = (sigma * fi.dt / epsz) 54 55 # 出なければ処理をスキップ 56 else : 57 continue 58 59 # 抽出した配列に1以外の要素があるなら処理をスキップ 60 else : 61 continue 62 63# テキストにgaz,gbzを保存 64np.savetxt('gaz_arrange.txt', gaz_n) 65np.savetxt('gbz_arrange.txt', gbz_n) 66 67 68 69""" 70ここからは散乱体の配置を画像として保存するためのコード 71""" 72 73# カラーマップ 74cm = plt.cm.get_cmap('RdYlBu') 75 76# figureを生成する 77fig = plt.figure() 78 79# axをfigureに設定する 80ax = fig.add_subplot(1, 1, 1) 81 82# Numpy配列をx,y,z軸に置き換えてaxに描画 83for i in tqdm(range(fi.je)): 84 x = range(fi.je) 85 y = [i] * fi.je 86 87 # Numpy配列からリストに変換 88 nd_z = gaz_n[i:i+1] 89 z = nd_z.tolist() 90 91 # axに散布図を描画、戻り値にPathCollectionを得る 92 mappable = ax.scatter(x, y, c=z, s=1, cmap=cm) 93 94# カラーバーを付加 95fig.colorbar(mappable, ax=ax) 96 97# 保存 98plt.savefig("scatter_field.png")
試したこと
情報系の友人にコードを見せたところ、「画像にする部分に問題があるんじゃないか?」とアドバイスをもらいましたが、私には問題が見つけられませんでした。
補足情報
matplotlib 3.3.4
numpy 1.19.5


回答1件
あなたの回答
tips
プレビュー