使用Numpy(坐标变换)计算长表达式?

2024-05-13 02:02:54 发布

您现在位置:Python中文网/ 问答频道 /正文

在Pythons Numpy模块中,是否有一个函数可以计算数组上的长/高级数学表达式?我听说过numexp模块,但希望远离进一步的依赖关系。在

更好的是,我是否可以将这些表达式限制为只显示数组中子数组的第一个或第二个元素,而不必将它们解压为单独的数组?在

这是我的具体问题。我有一个数组,它包含地理点坐标,如下所示:[[x1,y1],[x2,y2],[x3,y3]等。我想要的是将这些地理坐标转换成像素坐标,这样就可以在图像上绘制它们。因此,我希望对每个子数组的第一个元素(即xs)运行以下表达式/计算:

((180+X)/360)*screenwidthpixels

关于第二个要素,即ys:

((-90+Y)/180)*-screenheightpixels

这些表达式可以在python for循环中工作,但是太慢了,这就是我转向Numpy的原因。我知道我可以而且曾经尝试过只将numpy的单个数学运算符函数连接在一起,但是仍然太慢了,而且,为了做到这一点,我首先必须将所有的xs和ys解压成单独的数组,然后在计算之后将它们重新打包在一起,这样会使计算变得更慢。在

所以我想我在寻找一种更直接的方式,使用上面的表达式,用更少的步骤来转换我的坐标数组。有什么想法吗?在


Tags: 模块函数numpy元素关系表达式数学数组
3条回答
import numpy as np
points = np.random.rand(10,2)
translation = np.array([180,-90])
scaling = np.array([1024, -768]) / np.array([360,180])
transformed_points = (points + translation) * scaling

这将满足您的要求。它依靠numpy广播规则来实现表现力和性能。在

但与其确切地解释它是如何工作的,我认为你最好给自己找一个好的numpy初级读物,并从顶部开始。numpy是python最棒的东西之一,学习一点也不会出错。可以说,纽比当然可以胜任你所面临的任务。在

我不知道你对X和Y说的“不得不拆箱”是什么意思。以下是避免拆箱的方法(如果我理解的话…)

arr = np.array([ [x1,y1], [x2,y2], [x3,y3] ])
arr.shape
=> (3, 2)
X = arr[:,0]  # fast, creates a view
Y = arr[:,1]  # fast too
((X+180)/360)/screenwidthpixels

通过重写/简化表达式可以进一步提高速度。在

^{pr2}$

在第一次重写中,将遍历数组2次,而不是3次;在第二次重写中,数组只被遍历两次,而不是4次。在

我有点困惑,因为我不知道你到底在说什么你已经试过了,或者成功的速度条件是什么。在

你是说你已经试过下面的方法了,但是太慢了?在

arr = whatever
arr[:,0] = (arr[:,0] + 180) / (360 * screenwidthpixels)
arr[:,1] = 180 - (arr[:,1] - 90) / (180 * screenheightpixels)

相关问题 更多 >