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/22 05:59
2019/09/22 06:18 編集
2019/09/22 06:19