在堆积条形图中定义每个条形图的底部

时间:2015-05-31 15:30:51

标签: python arrays numpy matplotlib difference

我有一个形状absolute_heights的二维数组(2, 6)。我想定义一个新的形状bottoms的二维数组(2, 6),在每个位置0保留i,除非

1)absolute_heights[0, i] - absolute_heights[1, i]的符号与absolute_heights[0, i]的符号相匹配,在这种情况下,bottoms[0, i]应设置为absolute_heights[1, i]

2)#1为false,在这种情况下bottoms[1, i]应设为absolute_heights[0, i]

以下是实现此目的的for循环:

def _get_bottoms(absolute_heights):
    """Define the bottom of each bar in a stacked bar graph.

    Parameters
    ----------
    absolute_heights : np.array
      The absolute height of each bar.  Stacking of the bars is along
      the first axis of this array.

    Returns
    -------
    bottoms : np.array
      The absolute height of the bar in each stack that is closest to
      zero.

    """
    bottoms = np.zeros((2, 6))
    for 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

numpy中有更有效的方法吗?

2 个答案:

答案 0 :(得分:1)

您可以使用布尔索引来避免for循环:

def _get_bottoms(absolute_heights):
    bottoms = np.zeros((2,6))
    diff = absolute_heights[0, :] - absolute_heights[1, :]
    i = np.sign(diff) == np.sign(absolute_heights[0, :])
    bottoms[0, i] = absolute_heights[1, i]
    bottoms[1, ~i] = absolute_heights[0, ~i]
    return bottoms

在此函数中i是一个布尔数组,指示符号是否匹配(基本上是您的if语句)。使用~i反转布尔值会为else语句提供数组。

答案 1 :(得分:1)

使用np.where

的另一种解决方案
b = np.where(np.sign(ah[0,:]) == np.sign(ah[0,:] - ah[1,:]), ah[1,:], 0.)
b2 = np.where(np.sign(ah[0,:]) != np.sign(ah[0,:] - ah[1,:]), ah[0,:], 0.)
np.vstack((b2,b))

不太可能比上面提到的快得多,可能 - 稍微更具可读性。

np.where获取一系列bool条件,然后使用第一个参数(上面为ah[1,:]),如果条件为True,则使用第二个参数(ah[0,:]以上)。