【问题标题】:How to manipulate a 3D array to convert from cartesian coordinates to spherical coordinates如何操作 3D 数组以将笛卡尔坐标转换为球坐标
【发布时间】:2021-09-19 07:11:18
【问题描述】:

所以我是 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)
 

我不断收到错误的转换结果。我尝试了不同的方法,但仍然无法弄清楚我做错了什么。

【问题讨论】:

  • 我不确定N, N, Nx, y, z 的关系如何。我希望有一个N, 33, N 坐标数组,或者一个定义三个轴的网格
  • 请发布一个连贯的minimal reproducible example 并展示您的期望与即将发布的内容
  • 我认为您的数据生成有点偏离。你想要一个包含 N 个点的数组,每个点都有三个坐标 x、y 和 z。因此,您的数组应该具有形状 (N, 3),因为您正在使用列来区分您发布的代码中的变量。顺便说一句,不要担心否决票。有些人固守规则,但在合理时却无法推理。您的代码中的错误很明显,您在问题中付出的努力也是如此。
  • 我现在明白了,@rocksNwaves!非常感谢您的反馈!

标签: python numpy multidimensional-array cartesian-coordinates spherical-coordinate


【解决方案1】:

我用唯一的 (x, y, z) 检查了该函数,它似乎可以转换为 (r, theta, phi) 就好了。

我认为您的问题在于如何获得随机 (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)

输出:

array_np: [0.2864 0.938 0.9243]

笛卡尔:x 0.2864 y 0.938 z 0.9243

球形:(1.3476626409849026, 1.274, 0.8150028593437515)

【讨论】:

  • 好的,这是我之前做过的测试,检查我的转换是否正确。但是如何转换 3D 数组呢?
  • 您应该阅读@rocksNwaves 的回答:stackoverflow.com/questions/68308053/… 我不确定我理解您所说的 3D 数组是什么意思(对我来说,3D 数组只是一个 (x, y, z)) .是不是三个(x、y、z)三元值?
  • 哦,我现在明白我的错误了。我推理错了:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-10
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多