gpt4 book ai didi

将 numpy 数组转换为另一个具有列索引的数组的 Pythonic 方法

转载 作者:太空宇宙 更新时间:2023-11-04 07:59:29 26 4
gpt4 key购买 nike

那么,根据这个输入,我想做的是:

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]]

谢谢

最佳答案

首先你的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')])

关于将 numpy 数组转换为另一个具有列索引的数组的 Pythonic 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42890970/

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