Python 按列(除1行外)切片numpy数组

Python 按列(除1行外)切片numpy数组,python,arrays,numpy,Python,Arrays,Numpy,如何按列分割numpy数组,并排除特定行 假设您有一个numpy数组,其中第一列作为“玩家”的索引,下一列是玩家在不同游戏中的得分。如何在排除一名球员的情况下返回一场比赛的分数 例如: [0 0 0 0 1 2 1 1 2 -6 0 2 3 4 1 3] score[ range(2) + [4], 1] 如果要返回第一个分数(第1列),请执行以下操作: >>score[:,1] [0,2,-6,4] 但如何排除一名球员/一排球员? 如果该玩家/第

如何按列分割numpy数组,并排除特定行

假设您有一个numpy数组,其中第一列作为“玩家”的索引,下一列是玩家在不同游戏中的得分。如何在排除一名球员的情况下返回一场比赛的分数

例如:

[0  0  0  0
 1  2  1  1 
 2 -6  0  2
 3  4  1  3]
score[ range(2) + [4], 1]
如果要返回第一个分数(第1列),请执行以下操作:

>>score[:,1]
[0,2,-6,4]
但如何排除一名球员/一排球员? 如果该玩家/第3排,您如何获得:

[0,2,-6]
[0,-6, 4]
或者,如果该玩家/第1行,您如何获得:

[0,2,-6]
[0,-6, 4]

您可以以列表的形式输入请求行的范围,例如:

[0  0  0  0
 1  2  1  1 
 2 -6  0  2
 3  4  1  3]
score[ range(2) + [4], 1]
对于更一般的谓词函数p(x)=1,如果x是一个好的行,可以执行以下操作:

score [ [x for x in range(score.shape[0]) if p(x)], 1]
>>> players = list(xrange(np.size(score, 0)))
>>> players
[0, 1, 2, 3]
>>> excludes = [2,3]
>>> players_to_include = [p for p in players if p not in excludes]
>>> players_to_include
[0, 1]
>>> score[players_to_include, 1]
array([0, 2])

您只需将要作为列表包含的玩家传递到
分数的第一个索引,如下所示:

>>> import numpy as np
>>> score = np.array([
... [0,0,0,0],
... [1,2,1,1],
... [2,-6,0,2],
... [3,4,1,3]
... ])
>>> players_to_include = [0,2,3]
>>> score[players_to_include, 1]
array([ 0, -6,  4])
这将只获得玩家[0,2,3]的分数

概括而言,您可以执行以下操作:

score [ [x for x in range(score.shape[0]) if p(x)], 1]
>>> players = list(xrange(np.size(score, 0)))
>>> players
[0, 1, 2, 3]
>>> excludes = [2,3]
>>> players_to_include = [p for p in players if p not in excludes]
>>> players_to_include
[0, 1]
>>> score[players_to_include, 1]
array([0, 2])

不。分数[[0,2],1]是完全合法的。请注意,您也可以使用
分数[[p(x)表示范围内的x(..)],1]
,因为numpy允许这样的布尔索引。