我正在尝试找出如何最好地找到覆盖在单位球体上的任意形状的质心,其中输入是形状边界的有序(顺时针或反cw)顶点.顶点的密度沿边界是不规则的,因此它们之间的弧长通常不相等.因为形状可能非常大(半个半球),所以通常不可能简单地将顶点投影到平面并使用平面方法,如维基百科上详述的那样(抱歉,我不允许超过2个超链接作为新手).稍微好一点的方法是使用在球坐标中操纵的平面几何,但同样,对于大的多边形,这种方法失败了,这里很好地说明了.在同一页上,'Cffk'强调了这篇论文,该论文描述了一种计算球面三角形质心的方法.我试图实现这种方法,但没有成功,我希望有人能发现问题?
我保留了与文章中类似的变量定义,以便于比较.输入(数据)是经度/纬度坐标列表,由代码转换为[x,y,z]坐标.对于每个三角形,我任意地将一个点固定为+ z-极,另外两个顶点由沿着多边形边界的一对相邻点组成.代码沿边界步进(从任意点开始),依次使用多边形的每个边界段作为三角形边.针对这些单独的球形三角形中的每一个确定子质心,并且根据三角形区域对它们进行加权并且将其相加以计算总多边形质心.我在运行代码时没有遇到任何错误,但返回的总质心显然是错误的(我已经运行了一些非常基本的形状,其中质心位置是明确的).我没有在返回的质心位置找到任何合理的模式......所以目前我不确定出现了什么问题,无论是数学还是代码(尽管,怀疑是数学).
如果您想尝试,下面的代码应该按原样进行复制粘贴.如果您安装了matplotlib和numpy,它将绘制结果(如果不这样,它将忽略绘图).您只需将代码下方的经度/纬度数据放入名为example.txt的文本文件中即可.
from math import *
try:
import matplotlib as mpl
import matplotlib.pyplot
from mpl_toolkits.mplot3d import Axes3D
import numpy
plotting_enabled = True
except ImportError:
plotting_enabled = False
def sph_car(point):
if len(point) == 2:
point.append(1.0)
rlon = radians(float(point[0]))
rlat = radians(float(point[1]))
x = cos(rlat) * cos(rlon) * point[2]
y = cos(rlat) * sin(rlon) * point[2]
z = sin(rlat) * point[2]
return [x, y, z]
def xprod(v1, v2):
x = v1[1] * …Run Code Online (Sandbox Code Playgroud) 我认识到这是我的安装失败,很抱歉向您提出这个无趣且无关紧要的问题,但我一生都无法弄清楚出了什么问题,我已经没有想法了。我希望有人能够快速指出显而易见的事情。
我正在尝试分析 python 脚本(使用 Kern 的 line_profiler),并且该脚本需要加载 netCDF4 模块。我已经用 pip 安装了 line_profiler 和 netCDF4。当我将 pip 排队以获取已安装软件包的列表时,两者都会报告为存在并更新。
在不使用探查器的情况下,我的脚本运行没有问题,这意味着 netCDF4 模块已正确加载。但是,如果我从“myscript”目录运行“kernprof -l -v myscript.py”,则会收到以下错误:
Traceback (most recent call last):
File "/usr/local/bin/kernprof", line 9, in <module>
load_entry_point('line-profiler==1.0', 'console_scripts', 'kernprof')()
File "Library/Python/2.7/site-packages/kernprof.py", line 221, in main
execfile(script_file, ns, ns)
File "myscript.py", line 5, in <module>
from netCDF4 import Dataset
ImportError: No module named netCDF4
Run Code Online (Sandbox Code Playgroud)
我正在从 /opt/local/bin/python 安装运行 Python,该安装在我的 PATH 中首先列出。
因此,无论如何,如果我设置的默认 Python 版本与我的 PATH 中首先出现的版本相同,并且该默认版本能够访问 netCDF4 模块,为什么 line_profiler 不能访问呢?
我对Python很陌生,对C很不了解(不幸的是)所以我正在努力正确理解使用Cython的一些方面.
在分析了一个Python程序并发现它只是几个在大部分时间都在占用的循环之后,我决定将它们转移到Cython中.最初,我让Cython按原样解释Python,结果是(非凡!)〜2倍的速度提升.凉!
从Python main,我传递函数两个2-D数组("a"和"b")和一个浮点数"d",它返回一个列表"newlist".例如:
a =[[12.7, 13.5, 1.0],[23.4, 43.1, 1.0],...]
b =[[0.46,0.95,0],[4.56,0.92,0],...]
d = 0.1
Run Code Online (Sandbox Code Playgroud)
这是原始代码,只为Cython添加了cdef:
def loop(a, b, d):
cdef int i, j
cdef double x, y
newlist = []
for i in range(len(a)):
if b[i][2] != 1:
for j in range(i+1,len(a)):
if a[i] == a[j] and b[j][2] != 1:
x = b[i][0]+b[j][0]
y = b[i][1]+b[j][1]
b[i][2],b[j][2] = 1,1
if abs(y)/abs(x) > d:
if y > 0: newlist.append([a[i][0],a[i][1],y])
return newlist
Run Code Online (Sandbox Code Playgroud)
在"纯Python"中,这在~12.5秒内运行(有几万个循环).在Cython中,它运行在~6.3秒.完成近乎零的工作取得了很大进展!
然而,通过一点阅读,很明显可以做更多,更多的事情,所以我开始尝试应用一些类型更改来使事情变得更快,遵循Cython文档,在这里(也在评论中引用).
以下是收集的修改,旨在模仿Cython文档:
import numpy as np …Run Code Online (Sandbox Code Playgroud)