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

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

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

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

Python

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

Q&A

解決済

2回答

225閲覧

【python】数値(list)の代入の仕方について

mtnow

総合スコア13

NumPy

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

Python

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

0グッド

0クリップ

投稿2019/09/21 18:02

python初心者のmtnowです.
どなたかご教授いただければ幸いです。

困っていること

下記のように定義したz,y_c(個数が等しい)を用いてAを計算した際,Aの個数も51個になる.
例(z=[1,2,3],y_c=[1,2,3]としたとき,A=[11,22,3*3]として計算されるため)

実現したいこと

Aの個数を51*51個にしたい.
例(z=1,2,3,y_c=1,2,3としたとき,
A=11,12,13,21,22,23,31,32,3*3)となるようにz,y_cを代入したい.

python

1import numpy as np 2z_depth = 5 3c = 0.5 4z = np.arange(0,(z_depth+0.1)*10)/10 5y_c = np.arange((-z_depth*5),(z_depth+0.1)*5)/10 6##############z,y_cの個数が等しいことを確認########## 7print(len(y_c)) #51 8print(len(z)) #51 9################################################### 10A = z*y_c 11

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

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

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

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

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

guest

回答2

0

ベストアンサー

np.outerを使うのはどうでしょうか?

Python

1>>> import numpy as np 2>>> np.outer([1,2,3],[2,3,4]) 3array([[ 2, 3, 4], 4 [ 4, 6, 8], 5 [ 6, 9, 12]]) 6>>> len(np.outer([1,2,3],[2,3,4])) 73 8>>> np.ravel(np.outer([1,2,3],[2,3,4])) 9array([ 2, 3, 4, 4, 6, 8, 6, 9, 12]) 10>>> len(np.ravel(np.outer([1,2,3],[2,3,4]))) 119

簡略化のために,A=y_czとしていましたが,σy_heimen = (-2Pn*(y_c2)z)/(π(((y_c2)+(z**2)))**2)を要素数y_c,zの2乗で計算するために,np.outer,np.revalはつかえますか?

単純な掛け算ではなくを任意の演算を行う場合はやり方が変わってきます。np.outer,np.revalは使えません。

np.repeatとnp.tileを使ってy_cとzの要素数を掛け合わせます。そのうえで配列の各要素で演算を行わせるvectorizeを使って関数を定義し演算します。
単純な演算であればそのまま式を記述してください(vectorize不要)

Python

1import numpy as np 2import math 3 4def func(Pn, y_c, z): 5 try: 6 return (-2*Pn*(y_c**2)*z)/(math.pi*(((y_c**2)+(z**2)))**2) 7 except ZeroDivisionError: 8 return float('inf') 9 10z_depth = 5 11c = 0.5 12z = np.arange(0,(z_depth+0.1)*10)/10 13y_c = np.arange((-z_depth*5),(z_depth+0.1)*5)/10 14 15z_array = np.repeat(z, len(y_c)) 16y_c_array = np.tile(y_c, len(z)) 17 18print(len(z_array)) 19print(len(y_c_array)) 20 21#f = np.vectorize(func) 22#A = f(2000, y_c_array, z_array) 23A = (-2*2000*(y_c_array**2)*z_array)/(math.pi*(((y_c_array**2)+(z_array**2)))**2) 24 25print(len(A))

※結果があっているかは確認してません。
※y_cとzがともに0の場合、0割が発生するため、対策しています。

投稿2019/09/21 20:12

編集2019/09/22 07:20
nomuken

総合スコア1627

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

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

mtnow

2019/09/22 05:59

ご回答ありがとうございます. np.outerを用いて,要素の計算はできていましたが,len関数でAの要素数を確認したところ,z,y_cと要素数が同じになりました. Aの要素数をz,y_cの要素数の2乗にするための方法はありますか?
nomuken

2019/09/22 06:18 編集

np.outerは二つの1次元配列を演算して2次元配列で返してきます。 その配列に対してnp.ravelを使えば配列を一次元化できます。
mtnow

2019/09/22 06:19

追加ご回答ありがとうございます.問題解決しましたありがとうございます. 追加でご質問したいのですが,簡略化のために,A=y_c*zとしていましたが,σy_heimen = (-2*Pn*(y_c**2)*z)/(π*(((y_c**2)+(z**2)))**2)を要素数y_c,zの2乗で計算するために,np.outer,np.revalはつかえますか?
guest

0

リストなら内包表記があります。

Python

1z = [1,2,3] 2y_c = [1,2,3] 3 4[i*j for i in Z for j in y_c] 5 6#[1,2,3,2,4,6,3,6,9]

投稿2019/09/22 07:38

meg_

総合スコア10577

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問