Python 使用Numpy(坐标变换)计算长表达式?
在Pythons Numpy模块中,是否有一个函数可以计算数组上的长/高级数学表达式?我听说过numexp模块,但我不想再依赖它了 更好的是,我可以将这些表达式限制为仅表示数组中子数组的第一个或第二个元素,而不必将它们作为单独的数组进行解压缩吗 这是我的具体问题。我有一个包含地理点坐标的数组,看起来像这样:[[x1,y1],[x2,y2],[x3,y3]等等。我想要的是将这些地理坐标转换为像素坐标,以便在图像上绘制它们。因此,我希望对每个子阵列的第一个元素(即xs)运行以下表达式/计算:Python 使用Numpy(坐标变换)计算长表达式?,python,numpy,expression,coordinate-transformation,Python,Numpy,Expression,Coordinate Transformation,在Pythons Numpy模块中,是否有一个函数可以计算数组上的长/高级数学表达式?我听说过numexp模块,但我不想再依赖它了 更好的是,我可以将这些表达式限制为仅表示数组中子数组的第一个或第二个元素,而不必将它们作为单独的数组进行解压缩吗 这是我的具体问题。我有一个包含地理点坐标的数组,看起来像这样:[[x1,y1],[x2,y2],[x3,y3]等等。我想要的是将这些地理坐标转换为像素坐标,以便在图像上绘制它们。因此,我希望对每个子阵列的第一个元素(即xs)运行以下表达式/计算: ((1
((180+X)/360)*屏幕宽度像素
在第二个元素上,即ys:
(-90+Y)/180)*-屏幕高度像素
这些表达式可以在PythonFor循环中工作,但速度太慢,这就是我转向Numpy的原因。我知道我可以也曾经尝试过将numpys的单个数学运算符函数相互链接,但速度仍然太慢,而且,要做到这一点,我首先必须将所有的xs和ys解包到单独的数组中,并在计算后将它们重新打包在一起,这使得速度变得更慢
因此,我想我正在寻找一种更直接的Numpy方法,使用上面的表达式,使用更少的步骤来转换坐标数组。有什么想法吗?我有点困惑,因为我不确定你到底说了什么你已经尝试过了,或者成功的速度条件是什么 你是说你已经尝试过下面的方法,但是太慢了
arr = whatever
arr[:,0] = (arr[:,0] + 180) / (360 * screenwidthpixels)
arr[:,1] = 180 - (arr[:,1] - 90) / (180 * screenheightpixels)
我有点困惑,因为我不确定你说的你已经尝试过了,或者成功的速度条件是什么 你是说你已经尝试过下面的方法,但是太慢了
arr = whatever
arr[:,0] = (arr[:,0] + 180) / (360 * screenwidthpixels)
arr[:,1] = 180 - (arr[:,1] - 90) / (180 * screenheightpixels)
我不知道你对X和Y说的“必须拆包”是什么意思。以下是避免拆包的方法(如果我理解的话…) 通过重写/简化表达式可以进一步提高速度
((X+180)/360)/s => (X+180)/(360*s)
(180-((Y+90)/180))/s => (180/s-1/(2*s)) - y/(180*s)
在第一次重写中,您对数组进行了2次遍历,而不是3次,在第二次重写中,数组只遍历了两次,而不是4次。我不确定您对X和Y的“必须解包”是什么意思。以下是避免解包的方法(如果我理解的话…)
In [235]: xs=arange(1000)
In [236]: ys=arange(1, 1001)
In [237]: a=array([xs, ys]).T
In [238]: a
Out[238]:
array([[ 0, 1],
[ 1, 2],
[ 2, 3],
...,
[ 997, 998],
[ 998, 999],
[ 999, 1000]])
In [240]: a[:, 0]=(a[:, 0]+180)/360/1024
通过重写/简化表达式可以进一步提高速度
((X+180)/360)/s => (X+180)/(360*s)
(180-((Y+90)/180))/s => (180/s-1/(2*s)) - y/(180*s)
在第一次重写中,将遍历数组2次,而不是3次,在第二次重写中,只遍历数组2次,而不是4次
In [235]: xs=arange(1000)
In [236]: ys=arange(1, 1001)
In [237]: a=array([xs, ys]).T
In [238]: a
Out[238]:
array([[ 0, 1],
[ 1, 2],
[ 2, 3],
...,
[ 997, 998],
[ 998, 999],
[ 999, 1000]])
In [240]: a[:, 0]=(a[:, 0]+180)/360/1024
a[:,0]
提供了a
第一列的视图,速度快且节省内存
a[:,0]
提供了a
第一列的视图,速度快且节省内存
这将满足您的需求。它依靠numpy广播规则来实现表现力和性能
但我认为你最好还是找一本好的numpy入门书,从上面开始,而不是解释它是如何工作的。numpy是python最棒的东西之一,你再多了解一点也不会错。我只想说,numpy肯定能胜任你所面临的任务
这将满足您的需求。它依靠numpy广播规则来实现表现力和性能
但我认为你最好还是找一本好的numpy入门书,从上面开始,而不是解释它是如何工作的。numpy是python最棒的东西之一,你再多了解一点也不会错。可以说,numpy当然可以胜任您所面临的任务。我没有尝试使用[:,0]语法来选择子数组,也不知道我可以直接在numpy数组上使用普通的Python数学运算符。我以前用
xs,ys=incoords.T
将子数组“解包”,并使用numpy.subtract/multiply/etc运算符。但是,当我尝试你的建议时,它仍然和我以前的方法一样慢,并且在多次调用[:,0]之后,我得到了一些意想不到的行为,所以保持了旧方法。还有其他方法吗?哦,关于成功的速度条件,目前在我的计算机上,一个ca 1000 x/y的数组需要大约000013秒,如果可能的话,我想把它减少到十分之一(000001),或者至少一半(000005)。我没有尝试过使用[:,0]语法来选择子数组,也不知道我可以直接在numpy数组上使用普通的Python数学运算符。我以前用xs,ys=incoords.T
将子数组“解包”,并使用numpy.subtract/multiply/etc运算符。但是,当我尝试你的建议时,它仍然和我以前的方法一样慢,并且在多次调用[:,0]之后,我得到了一些意想不到的行为,所以保持了旧方法。还有其他方法吗?哦,关于成功的速度条件,目前在我的计算机上,一个ca 1000 x/y的数组需要大约000013秒,如果可能的话,我想把它减少到十分之一(000001),或者至少一半(000005)。正确的,我所说的“解包”是指通过调用xs,ys=incoords.T
创建新的xs和ys数组。你的[:,0]和[:,1]做的是等效的,但是当我尝试它们时,没有明显的速度差和其他一些奇怪的行为,所以我坚持我原来的方法。有没有类似但可供选择的方法来获取子阵列和/或更快的数学运算?+1顺便说一句,关于简化表达式的技巧,我不会想到这一点。不幸的是,后来我注意到我提供的表达是错误的。对于正确的方程(在上面的问题中更新),我使用了在线方程简化器,发现只有第二个方程可以优化。是