所以,根据这个输入,我想做什么:
a=np.array([[5, 1, 10], [2, 3, 4]])
转换为另一个np数组:
[[(5, 0), (1, 1), (10, 2)], [(2, 0), (3, 1), (4, 2)]]
这样做的pythonic方式是什么?
编辑:我使用的是1索引但0索引也可以。添加了更多上下文以澄清。修复了初始化中的拼写错误。列索引表示项目。每个单元格中的值表示该项目的分数。我想要做的是根据分数按递减顺序对每一行进行排序,并抓取指数进行进一步处理。
所以,如果我有如上所述的输出,在排序后它看起来像:
[[(10, 2), (5, 0), (1, 1)], [(4,2), (3, 1), (2, 0)]]
然后我可以抓住指数:
[[2, 0, 1],[2, 1, 0]]
由于
答案 0 :(得分:4)
首先,您的a
表达式缺失[]
In [231]: a=np.array([[5, 1, 10], [2, 3, 4]]) # add extra []
In [232]: a
Out[232]:
array([[ 5, 1, 10],
[ 2, 3, 4]])
列表理解是生成显示列表的最简单方法
In [233]: [[(n,i+1) for i,n in enumerate(row)] for row in a]
Out[233]: [[(5, 1), (1, 2), (10, 3)], [(2, 1), (3, 2), (4, 3)]]
我也可以通过连接np.arange(1,4)
来实现,但内部元素不会是元组。我必须使用结构化数组才能获得这种显示效果。
这是我们通过连接得到的那种3d数组:
In [234]: np.array(_)
Out[234]:
array([[[ 5, 1],
[ 1, 2],
[10, 3]],
[[ 2, 1],
[ 3, 2],
[ 4, 3]]])
具有相同tolist()
输出的结构化数组:
In [244]: alist=[[(n,i+1) for i,n in enumerate(row)] for row in a]
In [245]: a3=np.array(alist, dtype='i,i')
In [246]: a3
Out[246]:
array([[( 5, 1), ( 1, 2), (10, 3)],
[( 2, 1), ( 3, 2), ( 4, 3)]],
dtype=[('f0', '<i4'), ('f1', '<i4')])
直接建设:
In [254]: a2=np.zeros((a.shape[0],a.shape[1],2),a.dtype)
In [255]: a2[:,:,0]=a
In [256]: a2[:,:,1]=np.arange(1,4)
In [257]: a2
Out[257]:
array([[[ 5, 1],
[ 1, 2],
[10, 3]],
[[ 2, 1],
[ 3, 2],
[ 4, 3]]])
或结构化案例:
In [258]: a2=np.zeros((a.shape[0],a.shape[1]),dtype='i,i')
In [259]: a2['f0']=a
In [260]: a2['f1']=np.arange(1,4)
相同的构造,但编辑中描述的排序值:
In [281]: idx=np.argsort(-a,axis=1)
In [282]: a1 = -np.sort(-a,1)
In [283]: a2=np.zeros((a.shape[0],a.shape[1]),dtype='i,i')
In [285]: a2['f0']=a1
In [286]: a2['f1']=idx
In [287]: a2
Out[287]:
array([[(10, 2), ( 5, 0), ( 1, 1)],
[( 4, 2), ( 3, 1), ( 2, 0)]],
dtype=[('f0', '<i4'), ('f1', '<i4')])
答案 1 :(得分:2)
要获得相应列索引的最终输出,这些索引以相应的行降序显示相应的行,只需将axis
参数列为1
或{-1
即可在每行中使用np.argsort
{1}}如果您正在处理多维数组,然后使用[:,::-1]
或[...,::-1]
翻转列以获取多维数组。使用argsort
的替代方法是使用输入数组的否定版本。这样我们就不会处理堆积的索引元组及其分数。
因此,np.argsort
的两个解决方案将是 -
np.argsort(a,axis=1)[:,::-1]
np.argsort(-a,axis=1)
示例运行 -
In [51]: a
Out[51]:
array([[ 5, 1, 10],
[ 2, 3, 4]])
In [52]: np.argsort(a,axis=1)[:,::-1]
Out[52]:
array([[2, 0, 1],
[2, 1, 0]])
In [53]: np.argsort(-a,axis=1)
Out[53]:
array([[2, 0, 1],
[2, 1, 0]])