gpt4 book ai didi

python - 按索引克隆列表中的项目

转载 作者:行者123 更新时间:2023-11-30 22:19:55 24 4
gpt4 key购买 nike

我有一个 numpy 数组

np.array([[1,4,3,5,2],
[3,2,5,2,3],
[5,2,4,2,1]])

我想通过索引来克隆项目。例如,我的索引为

np.array([[1,4], 
[2,4],
[1,4]])

这些对应于每行中项目的位置。例如第一个 [1,4] 是第一行中 4、2 的索引。

我希望最终返回一个新的 numpy 数组,给出初始数组和索引数组。

np.array([[1,4,4,3,5,2,2],
[3,2,5,5,2,3,3],
[5,2,2,4,2,1,1]])

效果是所选列值重复一次。有办法做到这一点吗?谢谢。

最佳答案

我评论说这可以被视为一维问题。除了每行添加 2 个值之外,它与二维无关,因此最终得到一个二维数组。另一个关键思想是 np.repeats 让我们可以多次重复选定的元素。

In [70]: arr =np.array([[1,4,3,5,2],
...: [3,2,5,2,3],
...: [5,2,4,2,1]])
...:
In [71]: idx = np.array([[1,4],
...: [2,4],
...: [1,4]])
...:

创建一个“重复”计数数组 - 所有内容都从 1 开始,并为我们想要重复的元素添加 1:

In [72]: repeats = np.ones_like(arr)
In [73]: repeats
Out[73]:
array([[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]])
In [74]: for i,j in enumerate(idx):
...: repeats[i,j] += 1
...:
In [75]: repeats
Out[75]:
array([[1, 2, 1, 1, 2],
[1, 1, 2, 1, 2],
[1, 2, 1, 1, 2]])

现在只需对展平的数组应用repeat,然后 reshape :

In [76]: np.repeat(arr.ravel(),repeats.ravel())
Out[76]: array([1, 4, 4, 3, 5, 2, 2, 3, 2, 5, 5, 2, 3, 3, 5, 2, 2, 4, 2, 1, 1])
In [77]: _.reshape(3,-1)
Out[77]:
array([[1, 4, 4, 3, 5, 2, 2],
[3, 2, 5, 5, 2, 3, 3],
[5, 2, 2, 4, 2, 1, 1]])

一旦我解决了这个问题,我可能会添加一个列表解决方案。

<小时/>

逐行np.insert解决方案(充实@f5r5e5d建议的概念):

用一行测试:

In [81]: row=arr[0]
In [82]: i=idx[0]
In [83]: np.insert(row,i,row[i])
Out[83]: array([1, 4, 4, 3, 5, 2, 2])

现在迭代地应用于所有行。然后可以将数组列表转回数组:

In [84]: [np.insert(row,i,row[i]) for i,row in zip(idx,arr)]
Out[84]:
[array([1, 4, 4, 3, 5, 2, 2]),
array([3, 2, 5, 5, 2, 3, 3]),
array([5, 2, 2, 4, 2, 1, 1])]

关于python - 按索引克隆列表中的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48968633/

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