如何操作3d数组以将笛卡尔坐标转换为球坐标

xn1cxnb4  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(491)

我是python新手,我想将包含笛卡尔坐标的3d数组转换为球坐标。我已经完成了计算转换的函数:

def cart2sph(x, y, z):
   xy = np.sqrt(x**2 + y**2) # sqrt(x² + y²)

   x_2 = x**2
   y_2 = y**2
   z_2 = z**2

   r = np.sqrt(x_2 + y_2 + z_2) # r = sqrt(x² + y² + z²)

   theta = np.arctan2(y, x) 

   phi = np.arctan2(xy, z) 

   return r, theta, phi

但是,如果我有一个随机数组(n,n,n),比如

N = 3   
array = np.random.rand(N, N, N).astype(dtype=np.float16)

然后把x,y,z坐标传给我的函数,把笛卡尔坐标转换成球面坐标

x = np.asarray(array_np)[:,0].astype(dtype=np.float16)

y = np.asarray(array_np)[:,1].astype(dtype=np.float16)

z = np.asarray(array_np)[:,2].astype(dtype=np.float16)

sphere_coord = cart2sph(x,y,z)

我不断得到错误的转换结果。我尝试过不同的方法,但仍然不知道我做错了什么。

4ngedf3f

4ngedf3f1#

我用一个唯一的(x,y,z)检查了这个函数,它似乎转换成(r,θ,φ)很好。
我认为你的问题在于如何得到随机数(x,y,z)。也许可以试试这样:

import numpy as np

def cart2sph(x, y, z):
   xy = np.sqrt(x**2 + y**2) # sqrt(x² + y²)

   x_2 = x**2
   y_2 = y**2
   z_2 = z**2

   r = np.sqrt(x_2 + y_2 + z_2) # r = sqrt(x² + y² + z²)

   theta = np.arctan2(y, x) 

   phi = np.arctan2(xy, z) 

   return r, theta, phi

N = 3   
array_np = np.random.rand(N).astype(dtype=np.float16)
print('array_np:')
print(array_np)

x = np.asarray(array_np)[0].astype(dtype=np.float16)

y = np.asarray(array_np)[1].astype(dtype=np.float16)

z = np.asarray(array_np)[2].astype(dtype=np.float16)

sphere_coord = cart2sph(x,y,z)

print('\nCartesian:')
print('x',x,'\ny',y,'\nz',z)

print('\nSpherical:')
print(sphere_coord)

输出:
数组_np:[0.2864 0.938 0.9243]
笛卡尔坐标:x 0.2864 y 0.938 z 0.9243
球形:(1.3476626409849026,1.274,0.8150028593437515)

相关问题