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

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

新規登録して質問してみよう
ただいま回答率
87.20%
多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

解決済

指定したNumpy配列内に円形に数値を配置したいが、おかしくなってしまう。

ShibaSamo
ShibaSamo

総合スコア15

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

1回答

0評価

0クリップ

343閲覧

投稿2022/01/11 21:06

編集2022/01/16 06:49

前提・実現したいこと

Python3.6.8にて、Numpy配列内に円形に多数の(一定の)値をセットしたいのですが、上手くいきません。

発生している問題・エラーメッセージ

以下の図は現時点でセットした値を、散布図に色を付けるという形で表したものです。
200x200のセル配置において、端から20セルずつ離してランダムに円形に並べたいと考えており、そのようにコードを書いたのですが、想定外の部分にも値がセットされてしまいます。
(下の図において、小さい円は本来私がセットしたかったもので、上部と下部の長方形及び中部にある横一列の赤色の部分の配置をなくしたいです)
イメージ説明

該当のソースコード

以下はソースコードです。
上の図にはgazを示しています。
全範囲に配置(端から20セルと散乱体の半径分あけて)
の行から
抽出した配列に1以外の要素があるなら処理をスキップ
の部分までが、値を円の形にセットする部分です。

python3.6

#!/usr/bin/env python # -*- coding: utf-8 -*- """ fd2d 散乱体の配置設定用 """ from os import get_terminal_size import numpy as np import scipy.constants as sc from math import e, pi, sin, sqrt, ceil from tqdm import tqdm from matplotlib import pyplot as plt import fd2d_init_value as fi # 初期値からgazをimport gaz_n = fi.gaz gbz_n = fi.gbz # 誘電体のパラメータ設定 epsr = 30 sigma= -0.01 radius= 2.5 epsz = 8.854e-12 # 散乱体が発生する確率を決める(p分の1) p = 200 # 全範囲に配置(端から20セルと散乱体の半径分あけて) for j in tqdm( range(ceil(radius) + 20, fi.je - ceil(radius) - 20) ): for i in range( ceil(radius) + 20, fi.ie - ceil(radius) - 20): # Numpy配列から散乱体を置く(かもしれない)範囲を抽出 sample_array = gaz_n[i-ceil(radius):i+ceil(radius),j-ceil(radius):j+ceil(radius)] # 抽出した配列に1以外の要素がないかチェック if np.any(sample_array != 1) == False: # p面のサイコロを作る dice = list(range(1, p)) # サイコロを振って、1の目が出たときだけ(=1/pの確率で)処理を実行 if np.random.choice(dice) == 1: for k in range(j-ceil(radius), j+ceil(radius)): for l in range(i-ceil(radius), i+ceil(radius)): xdist = (l - i) ydist = (k - j) dist= sqrt(xdist ** 2 + ydist ** 2) if dist <= radius: gaz_n[l, k] = 1 / (epsr + (sigma * fi.dt / epsz)) gbz_n[l, k] = (sigma * fi.dt / epsz) # 出なければ処理をスキップ else : continue # 抽出した配列に1以外の要素があるなら処理をスキップ else : continue # テキストにgaz,gbzを保存 np.savetxt('gaz_arrange.txt', gaz_n) np.savetxt('gbz_arrange.txt', gbz_n) """ ここからは散乱体の配置を画像として保存するためのコード """ # カラーマップ cm = plt.cm.get_cmap('RdYlBu') # figureを生成する fig = plt.figure() # axをfigureに設定する ax = fig.add_subplot(1, 1, 1) # Numpy配列をx,y,z軸に置き換えてaxに描画 for i in tqdm(range(fi.je)): x = range(fi.je) y = [i] * fi.je # Numpy配列からリストに変換 nd_z = gaz_n[i:i+1] z = nd_z.tolist() # axに散布図を描画、戻り値にPathCollectionを得る mappable = ax.scatter(x, y, c=z, s=1, cmap=cm) # カラーバーを付加 fig.colorbar(mappable, ax=ax) # 保存 plt.savefig("scatter_field.png")

試したこと

情報系の友人にコードを見せたところ、「画像にする部分に問題があるんじゃないか?」とアドバイスをもらいましたが、私には問題が見つけられませんでした。

補足情報

matplotlib 3.3.4
numpy 1.19.5

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

fourteenlength

2022/01/11 21:48 編集

再現するためにfd2d_init_value を掲載できますか? --- ありがちなのは「matplotlibでカラーバーを使っていて、カラーバーのスケールのせいで思ったように表示されていなかった」です。これを防ぐため、念のために fig.colorbar(mappable, ax=ax) のあとに、 plt.clim(表示させたい最低値の範囲(例えばゼロ, 表示させたい最高値の範囲(例えば1)) を加えてください。
tachikoma

2022/01/13 03:37 編集

---(間違えました)

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。