gpt4 book ai didi

python - n 球坐标系到笛卡尔坐标系

转载 作者:太空狗 更新时间:2023-10-29 22:22:43 32 4
gpt4 key购买 nike

在笛卡尔坐标系和n-spherical one之间有什么有效的转换方式吗? ?改造如下: enter image description here

以下是我的代码,但我想摆脱循环:

import numpy as np
import scipy.sparse

def coord_transform_n(r,alpha):
"""alpha: the n-2 values between [0,\pi) and last one between [0,2\pi)
"""
x=[]
for i in range(alpha.shape[0]):
x.append(r*np.prod(np.sin(alpha[0:i]))*np.cos(alpha[i]))
return np.asarray(x)
print coord_transform_n(1,np.asarray(np.asarray([1,2])))

最佳答案

您的原始代码可以通过内存中间 sin 产品来加速,即

def ct_dynamic(r, alpha):
"""alpha: the n-2 values between [0,\pi) and last one between [0,2\pi)
"""
x = np.zeros(len(alpha) + 1)
s = 1
for e, a in enumerate(alpha):
x[e] = s*np.cos(a)
s *= np.sin(a)
x[len(alpha)] = s
return x*r

但速度上仍然不如基于 numpy 的方法

def ct(r, arr):
a = np.concatenate((np.array([2*np.pi]), arr))
si = np.sin(a)
si[0] = 1
si = np.cumprod(si)
co = np.cos(a)
co = np.roll(co, -1)
return si*co*r

>>> n = 10
>>> c = np.random.random_sample(n)*np.pi
>>> all(ct(1,c) == ct_dynamic(1,c))
True

>>> timeit.timeit('from __main__ import coord_transform_n as f, c; f(2.4,c)', number=10000)
2.213547945022583

>>> timeit.timeit('from __main__ import ct_dynamic as f, c; f(2.4,c)', number=10000)
0.9227950572967529

>>> timeit.timeit('from __main__ import ct as f, c; f(2.4,c)', number=10000)
0.5197498798370361

关于python - n 球坐标系到笛卡尔坐标系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20133318/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com