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

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

新規登録して質問してみよう
ただいま回答率
85.35%
NumPy

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

793閲覧

python numpy.rollに関する質問

KTT11

総合スコア0

NumPy

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/12/30 08:52

前提・実現したいこと

pythonで格子ボルツマン法の気体シミュレーションを作っています。
境界条件について検討する段階で、以下の問題に直面しました。

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

関数stream()内のnp.rollの第三引数にあたえるのはaxis=(0か1)しかないのではないと認識していたため、 以下のソースコードのがなぜ成り立つのかわかりません。 第三引数に軸を指定しているとネットには書いてあったのですが、どこを軸ととらえているのでしょうか。 説明をお願いしたいと思います。 以下のソースコードはこちらのサイトを参照しています。 https://salad-bowl-of-knowledge.github.io/hp/physics/2018/01/30/lattice_boltzmann.html

該当のソースコード

import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation from ipywidgets import interact w = np.array([4/9 , 1 / 9, 1 / 9, 1 / 9, 1 / 9, 1 / 36, 1 / 36, 1 / 36, 1 / 36]) e = np.array([[0, 0], [0, 1], [0, -1], [1, 0], [-1, 0], [1, 1], [-1, -1],[1, -1], [-1, 1]]) def stream(): #障害物との衝突処理 global n for i, axis in zip(range(1, 5),[[1, 1, 0, 1], [1, -1, 0, -1], [0, 1, 1, -1], [0, -1, 1, 1]]): #(1)式 n[:, :, i] = np.roll(n[:, :, i], axis[1], axis=axis[0]) n[:, :, i + 4] = np.roll(np.roll(n[:, :, i + 4], axis[1],axis=axis[0]),axis[3],axis=axis[2]) for i in range(1, 9): n[:, :, i][barrier[:, :, i]] = n[:, :, i - (-1)**i][barrier[:, :, 0]] #衝突した分を逆向きの成分に流してます。

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

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

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

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

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

guest

回答1

0

関数stream()内のnp.rollの第三引数にあたえるのはaxis=(0か1)しかないのではないと認識していたため、
以下のソースコードのがなぜ成り立つのかわかりません。

とありますが,まぁその通りです。
ただ,ソースのfor文で利用されているaxis変数が分かりにくいのだと思います。

該当のソースを次のように書き換えると理解いただけるでしょうか?
(あくまでイメージで,実際動くかどうかは分かりません)

python

1def stream(): #障害物との衝突処理 2 global n 3 # 軸A 数A 軸B 数B 4 tbl = [[1, 1, 0, 1], 5 [1, -1, 0, -1], 6 [0, 1, 1, -1], 7 [0, -1, 1, 1]] 8 軸A = 0 9 数A = 1 10 軸B = 2 11 数B = 3 12 # iは 1,2,3,4 13 for i,in zip(range(1, 5), tbl): #(1)式 14 n[:, :, i] = np.roll(n[:, :, i],[数A], axis=[軸A]) 15 n[:, :, i + 4] = np.roll(np.roll(n[:, :, i + 4],[数A],axis=[軸A]),[数B],axis=[軸B]) 16 for i in range(1, 9): 17 n[:, :, i][barrier[:, :, i]] = n[:, :, i - (-1)**i][barrier[:, :, 0]] #衝突した分を逆向きの成分に流してます。

np.rollの第三変数にはtbl軸A列と軸B列の値が入り,これは0と1しか入っていません。

あくまで想像ですが,研究室の続き研究で前任の方から引き継いだソースっぽい印象を受けます。
頑張って解読してみて下さい。

投稿2022/01/09 11:10

ujimushi_sradjp

総合スコア2152

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問