Pandas is built on NumPy, NumPy is built on Eigen, which is C++ ;-)
 
 
 
 
Sent: Friday, December 06, 2019 at 3:41 PM
From: "Israel Brewster" <ijbrews...@alaska.edu>
To: "Andrew Nelson" <andyf...@gmail.com>
Cc: "Jason H" <jh...@gmx.com>, "pyside@qt-project.org" <pyside@qt-project.org>
Subject: Re: [PySide] Keeping GUI responsive
On Dec 6, 2019, at 11:34 AM, Andrew Nelson <andyf...@gmail.com> wrote:
 
Whilst I'm not familiar with pandas it's behaviour is probably similar to NumPy in terms of vectorisation. It looks to me that you can vectorise that loop. Removing loops will give you *enormous* speedup. I don't claim this is the most numpythonic, there may be some kind of modulo arithmetic for doing this more easily.
 
You are correct - in fact, my understanding is that pandas actually uses NumPy under the hood, and as such most NumPy operations/optimizations apply. And yes, that loop has been bugging me, as it looks to me as well that I should be able to vectorize it. In fact, I’ve been able to do exactly that to numerous other loops I have found in the code (I’m not the original author), with great success. I simply haven’t yet been able to wrap my head around exactly how to vectorize this one. But that’s a different question, for a different mailing list :-)
 
…although if I can do enough optimizations, I suppose that would make this issue a moot point :-)
---
Israel Brewster
Software Engineer
Alaska Volcano Observatory 
Geophysical Institute - UAF 
2156 Koyukuk Drive 
Fairbanks AK 99775-7320
Work: 907-474-5172
cell:  907-328-9145
 
 
``` 
dx = self.contour_df['delta_utmx_volc']
dy = self.contour_df['delta_utmy_volc']
 
loc = np.logical_and(dx > 0, dy > 0)
self.contour_df['volc_azimuth'][loc] = self.contour_df['volc_theta'][loc]
 
# the complement of loc is both dx and dy are negative, or equal to zero (you didn't deal with that case)
self.contour_df['volc_azimuth'][~loc] = 360 - self.contour_df['volc_theta'][~loc]
 
 
loc = np.logical_and(dx > 0, dy < 0)
self.contour_df['volc_azimuth'][loc] = 180 - self.contour_df['volc_theta'][loc]
 
loc = np.logical_and(dx < 0, dy > 0)
self.contour_df['volc_azimuth'][loc] = 180 + self.contour_df['volc_theta'][loc]
```
 
 
        for i in range(self.contour_df.index[0], self.contour_df.index.max()):
            dx = self.contour_df['delta_utmx_volc'][i]
            dy = self.contour_df['delta_utmy_volc'][i]

            if dx > 0 and dy > 0:
                self.contour_df['volc_azimuth'][i] = self.contour_df['volc_theta'][i]

            elif dx > 0 > dy:
                self.contour_df['volc_azimuth'][i] = 180 - self.contour_df['volc_theta'][i]

            elif dx < 0 and dy < 0:
                self.contour_df['volc_azimuth'][i] = 180 + self.contour_df['volc_theta'][i]

            elif dx < 0 < dy:
                self.contour_df['volc_azimuth'][i] = 360 - self.contour_df['volc_theta'][i]

            if i % 50 == 0:
                self.yield_thread()

        self.contour_df['volc_dist'] = np.sqrt((self.contour_df['delta_utmy_volc']**2) + (self.contour_df['delta_utmx_volc']**2))  # distance from point to volcano
 
_______________________________________________
PySide mailing list
PySide@qt-project.org
https://lists.qt-project.org/listinfo/pyside

Reply via email to