> 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