我有一个形状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
中有更有效的方法吗?
答案 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,:]
以上)。