Skip to content

Commit 5cab310

Browse files
committed
PRF: .shift() speedup: Only pass in c_contiguous arrays to np.roll/take
1 parent 1eab1a2 commit 5cab310

File tree

2 files changed

+13
-4
lines changed

2 files changed

+13
-4
lines changed

pandas/core/generic.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3238,9 +3238,9 @@ def shift(self, periods=1, freq=None, axis=0, **kwds):
32383238
if periods == 0:
32393239
return self
32403240

3241-
axis = self._get_axis_number(axis)
3241+
block_axis = self._get_block_manager_axis(axis)
32423242
if freq is None and not len(kwds):
3243-
new_data = self._data.shift(periods=periods, axis=axis)
3243+
new_data = self._data.shift(periods=periods, axis=block_axis)
32443244
else:
32453245
return self.tshift(periods, freq, **kwds)
32463246

pandas/core/internals.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -966,15 +966,24 @@ def shift(self, periods, axis=0):
966966
# convert integer to float if necessary. need to do a lot more than
967967
# that, handle boolean etc also
968968
new_values, fill_value = com._maybe_upcast(self.values)
969-
new_values = np.roll(new_values.T,periods,axis=axis)
969+
# make sure array sent to np.roll is c_contiguous
970+
f_ordered = new_values.flags.f_contiguous
971+
if f_ordered:
972+
new_values = new_values.T
973+
axis = new_values.ndim - axis - 1
974+
new_values = np.roll(new_values, periods, axis=axis)
970975
axis_indexer = [ slice(None) ] * self.ndim
971976
if periods > 0:
972977
axis_indexer[axis] = slice(None,periods)
973978
else:
974979
axis_indexer[axis] = slice(periods,None)
975980
new_values[tuple(axis_indexer)] = fill_value
976981

977-
return [make_block(new_values.T, self.items, self.ref_items,
982+
# restore original order
983+
if f_ordered:
984+
new_values = new_values.T
985+
986+
return [make_block(new_values, self.items, self.ref_items,
978987
ndim=self.ndim, fastpath=True)]
979988

980989
def eval(self, func, other, raise_on_error=True, try_cast=False):

0 commit comments

Comments
 (0)