gpt4 book ai didi

python - 广播二维数组的一列与多列的比较

转载 作者:行者123 更新时间:2023-11-28 22:34:05 26 4
gpt4 key购买 nike

在 2d ndarray 中将一列与其他列进行比较的正确 numpy 语法是什么?

看完some docs关于阵列广播,我仍然不太确定正确的方法是什么。

示例:假设我有一个二维数组,其中包含每场比赛(列)中每位球员(行)的进球。

# goals = number of goals scored by ith player in jth game (NaN if player did not play)
# column = game
goals = np.array([ [np.nan, 0, 1], # row = player
[ 1, 2, 0],
[ 0, 0, np.nan],
[np.nan, 1, 1],
[ 0, 0, 1] ])

我想知道,在最后一场比赛中,球员是否创造了比她之前任何一场比赛进球更多的个人记录,忽略她没有出场的比赛(表示为 nan).我希望 True 仅适用于数组中的第一个和最后一个玩家。

只需编写 goals[:,2] > goals[:,:2] 返回 ValueError: operands could not be broadcast together with shapes (5,) (5,2)

我尝试了什么:我知道我可以使用 (5,) 手动拉伸(stretch)为 (5,2) np.newaxis.所以这有效:

with np.errstate(invalid='ignore'):
personalBest= ( np.isnan(goals[:,:2]) |
(goals[:,2][:,np.newaxis] > goals[:,:2] )
).all(axis=1)

print(personalBest) # returns desired solution

有没有更简单、更惯用的 numpy 方式来写这个?

最佳答案

你可以这样做 -

np.flatnonzero((goals[:,None,-1] > goals[:,:-1]).any(1))

让我们逐步了解它。

第 1 步:我们在最后一列切片版本上引入了一个新轴,以将其保持为 2D,最后一个轴是单一维度/轴。这个想法是将它的每个元素与该行中除元素本身之外的所有元素进行比较:

In [3]: goals[:,None,-1]
Out[3]:
array([[ 1.],
[ 0.],
[ nan],
[ 1.],
[ 1.]])

In [4]: goals[:,None,-1].shape # Check the shapes for broadcasting alignment
Out[4]: (5, 1)

In [5]: goals.shape
Out[5]: (5, 3)

第 2 步:接下来,我们实际上是对数组的所有列执行比较,跳过最后一列本身,因为这是之前获得的切片版本的一部分 -

In [7]: goals[:,None,-1] > goals[:,:-1]
Out[7]:
array([[False, True],
[False, False],
[False, False],
[False, False],
[ True, True]], dtype=bool)

第 3 步: 然后,我们检查每一行是否有任何匹配 -

In [8]: (goals[:,None,-1] > goals[:,:-1]).any(axis=1)
Out[8]: array([ True, False, False, False, True], dtype=bool)

第 4 步: 最后,使用 np.flatnonzero 获取匹配索引 -

In [9]: np.flatnonzero((goals[:,None,-1] > goals[:,:-1]).any(axis=1))
Out[9]: array([0, 4])

关于python - 广播二维数组的一列与多列的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39277113/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com