直角坐标到柱坐标的变换
Transformation of Cartesian coordinates to Cylindrical coordinates
请问这是怎么回事?我想定义笛卡尔坐标系,然后我想计算相对于轴 x 的圆柱坐标。
我收到一个错误:
R = math.sqrt(y[i]**2 + z[i]**2)
TypeError: only size-1 arrays can be converted to Python scalars
代码:
import numpy as np
import math
XMIN =-0.15
XMAX = 0.15
YMIN = -0.1
YMAX = 0.1
ZMIN = -0.1
ZMAX = 0.1
sampling = 100
x_ = np.linspace(XMIN, XMAX, sampling)
y_ = np.linspace(YMIN, YMAX, sampling)
z_ = np.linspace(ZMIN, ZMAX, sampling)
x, y, z = np.meshgrid(x_, y_, z_, indexing='ij')
assert np.all(x[:,0,0] == x_)
assert np.all(y[0,:,0] == y_)
assert np.all(z[0,0,:] == z_)
# cylindric coordinates (R, theta, z)
R_coor = []
THETA_coor = []
Z_coor = []
for i in range(sampling-1):
R = math.sqrt(y[i]**2 + z[i]**2)
THETA = math.atan(y[i]/z[i])
Z = x[i]
R_coor.append(R)
THETA_coor.append(THETA)
Z_coor.append(Z)
差点打错字。
在有问题的行中,您使用的 math.sqrt
只能在 标量 上运行。您必须使用 numpy 版本 np.sqrt
来对 numpy ndarrays 进行操作,或者使用 x_, y_, z_
来获得标量。
所以你应该使用:
for i in range(sampling-1):
R = math.sqrt(y_[i]**2 + z_[i]**2)
THETA = math.atan2(y_[i], z_[i]) # always prefere atan2 to atan...
Z = x_[i]
R_coor.append(R)
THETA_coor.append(THETA)
Z_coor.append(Z)
或:
for i in range(sampling-1):
R = np.sqrt(y[i]**2 + z[i]**2)
THETA = np.arctan2(y[i],z[i])
Z = x[i]
R_coor.append(R)
THETA_coor.append(THETA)
Z_coor.append(Z)
无关,但 atan
会在 pi/2 处中断,因为您得到无限商并且只能在 ]-pi/2、[=28= 中形成 return 角][ open segment,而atan2可以处理整圈...
请问这是怎么回事?我想定义笛卡尔坐标系,然后我想计算相对于轴 x 的圆柱坐标。
我收到一个错误:
R = math.sqrt(y[i]**2 + z[i]**2)
TypeError: only size-1 arrays can be converted to Python scalars
代码:
import numpy as np
import math
XMIN =-0.15
XMAX = 0.15
YMIN = -0.1
YMAX = 0.1
ZMIN = -0.1
ZMAX = 0.1
sampling = 100
x_ = np.linspace(XMIN, XMAX, sampling)
y_ = np.linspace(YMIN, YMAX, sampling)
z_ = np.linspace(ZMIN, ZMAX, sampling)
x, y, z = np.meshgrid(x_, y_, z_, indexing='ij')
assert np.all(x[:,0,0] == x_)
assert np.all(y[0,:,0] == y_)
assert np.all(z[0,0,:] == z_)
# cylindric coordinates (R, theta, z)
R_coor = []
THETA_coor = []
Z_coor = []
for i in range(sampling-1):
R = math.sqrt(y[i]**2 + z[i]**2)
THETA = math.atan(y[i]/z[i])
Z = x[i]
R_coor.append(R)
THETA_coor.append(THETA)
Z_coor.append(Z)
差点打错字。
在有问题的行中,您使用的 math.sqrt
只能在 标量 上运行。您必须使用 numpy 版本 np.sqrt
来对 numpy ndarrays 进行操作,或者使用 x_, y_, z_
来获得标量。
所以你应该使用:
for i in range(sampling-1):
R = math.sqrt(y_[i]**2 + z_[i]**2)
THETA = math.atan2(y_[i], z_[i]) # always prefere atan2 to atan...
Z = x_[i]
R_coor.append(R)
THETA_coor.append(THETA)
Z_coor.append(Z)
或:
for i in range(sampling-1):
R = np.sqrt(y[i]**2 + z[i]**2)
THETA = np.arctan2(y[i],z[i])
Z = x[i]
R_coor.append(R)
THETA_coor.append(THETA)
Z_coor.append(Z)
无关,但 atan
会在 pi/2 处中断,因为您得到无限商并且只能在 ]-pi/2、[=28= 中形成 return 角][ open segment,而atan2可以处理整圈...