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

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

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

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

NumPy

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

Python 3.x

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

配列

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

Q&A

解決済

1回答

1030閲覧

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

ShibaSamo

総合スコア15

多次元配列

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

NumPy

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

Python 3.x

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

配列

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

0グッド

0クリップ

投稿2022/01/11 21:06

編集2022/01/11 21:07

前提・実現したいこと

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

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/01/11 21:48 編集

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

回答1

0

自己解決

すみません。
imshowという関数を使えば、同じようなことができると知りませんでした。
これからはもっとよく調べてから質問します。

投稿2022/01/15 21:49

ShibaSamo

総合スコア15

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問