gpt4 book ai didi

python - 根据另一个数组的索引将一个数组的子元素重新定位到不同的行中?

转载 作者:行者123 更新时间:2023-12-01 03:22:37 25 4
gpt4 key购买 nike

我正在尝试调整使用 this post 中的方法创建的数组的顺序.

基本上,根据数组的行索引(其中 axis=0),该索引的子元素已被删除(例如,如果查看索引 1,则仅存在元素 0 和 2)。

我需要一种方法将每个元素重新定位到与其原始索引相对应的行中。

>>> a = array([[[222],[333]],
[[111],[333]],
[[111],[222]]])

期望的输出:

>>> a = array([[[111],[111]],
[[222],[222]],
[[333],[333]]])

在我的尝试过程中,我认为这可能会接近:

>>> n = a.shape[0]
>>> row_idx = np.nonzero(~np.eye(n,dtype=bool))[1].reshape(n,n-1) # dim0 indices

>>> print a.ravel() #flatten the array
[222, 333, 111, 333, 111, 222]
>>> print row_idx #somehow use these indices to reposition corresponding elements
[1 2 0 2 0 1]

我不确定如何使用 row_idx 将元素对齐到相应的行,或者这是否是一种有效的方法?

谢谢!

最佳答案

使用扁平化 row_idx 获取reversed-argsort,并简单地用它索引到扁平化 a 中,最后 reshape -

a.ravel()[row_idx.ravel().argsort()].reshape(a.shape)

逐步运行 -

1) 扁平化数组和索引:

In [72]: a.ravel()
Out[72]: array([222, 333, 111, 333, 111, 222])

In [73]: row_idx.ravel()
Out[73]: array([1, 2, 0, 2, 0, 1])

2) 我们需要找到扁平化 a 的排列版本,我们称之为 a0,这样 a0[1] = 222a0[2] = 333等等。为了找到这些排列索引,我们需要在扁平化的 row_idx 上使用 argsort 。因此,使用这些索引到 a 以获得最终输出。为了以多维格式恢复输出,我们需要最终的 reshape :

In [77]: a.ravel()[row_idx.ravel().argsort()]
Out[77]: array([111, 111, 222, 222, 333, 333])

In [78]: a.ravel()[row_idx.ravel().argsort()].reshape(a.shape)
Out[78]:
array([[[111],
[111]],

[[222],
[222]],

[[333],
[333]]])

关于python - 根据另一个数组的索引将一个数组的子元素重新定位到不同的行中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41783783/

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