python - Define the bottom of each bar in a stacked bar graph -
i have two-dimensional array absolute_heights
of shape (2, 6)
. i'd define new two-dimensional array bottoms
of shape (2, 6)
holds 0
@ each position i
unless
1) sign of absolute_heights[0, i] - absolute_heights[1, i]
matches of absolute_heights[0, i]
, in case bottoms[0, i]
should set absolute_heights[1, i]
.
2) #1 false, in case bottoms[1, i]
should set absolute_heights[0, i]
.
below for
loop achieves this:
def _get_bottoms(absolute_heights): """define bottom of each bar in stacked bar graph. parameters ---------- absolute_heights : np.array absolute height of each bar. stacking of bars along first axis of array. returns ------- bottoms : np.array absolute height of bar in each stack closest zero. """ bottoms = np.zeros((2, 6)) i, diff in enumerate(absolute_heights[0, :] - absolute_heights[1, :]): if np.sign(diff) == np.sign(absolute_heights[0, i]): bottoms[0, i] = absolute_heights[1, i] else: bottoms[1, i] = absolute_heights[0, i] return bottoms
is there more efficient way of doing in numpy
?
you use boolean indexing avoid for
loop:
def _get_bottoms(absolute_heights): bottoms = np.zeros((2,6)) diff = absolute_heights[0, :] - absolute_heights[1, :] = np.sign(diff) == np.sign(absolute_heights[0, :]) bottoms[0, i] = absolute_heights[1, i] bottoms[1, ~i] = absolute_heights[0, ~i] return bottoms
in function i
boolean array indicating whether signs match (essentially if
statement). inverting boolean values ~i
gives array else
statement.
Comments
Post a Comment