numpy 恢复行元素的原始顺序

xzv2uavs  于 2022-12-04  发布在  其他
关注(0)|答案(1)|浏览(126)

考虑下面所示的numpy数组p。每一行都使用0到9的唯一值。区别特征是每一行都由5个(在本例中)值和5个其他值组成。当p[k] = p[p[k]](k = 0到9)时,形成对

p = np.array([[1, 0, 3, 2, 5, 4, 7, 6, 9, 8], 
             ... 
             [6, 5, 3, 2, 9, 1, 0, 8, 7, 4],
             ...
             [9, 8, 5, 7, 6, 2, 4, 3, 1, 0]])

例如,检查以下行:

[6, 5, 3, 2, 9, 1, 0, 8, 7, 4]

由于p[6] = 0p[0] = 6,此行将值6和0配对。其他配对为值(5,1)、(3,2)、(9,4)、(8,7)。不同的行可能具有不同的配对排列。
现在,我们感兴趣的是每对的**第一个值(即:6、5、3、9、8)每对的第二个值(即:0,1,2,4,7)**我不确定这是否是最佳的处理方式,但我已按以下方式将第一对值与第二对值分开:

import numpy as np

p = np.array([6, 5, 3, 2, 9, 1, 0, 8, 7, 4])

p1 = np.where(p[p] < p)   # indices of 1st member of pairs
p2 = (p[p1])              # indices of 2nd member of pairs

qi = np.hstack((p1, p2.reshape(1,5)))
qv = p[qi]

#output: qi = [0, 1, 2, 4, 7,   6, 5, 3, 9, 8]   #indices of 1st of pair values, followed by 2nd of pair values 
#        qv = [6, 5, 3, 9, 8,   0, 1, 2, 4, 7]   #corresponding values

最后考虑另一个一维阵列:c = [1, 1, 1, 1, 1, -1, -1, -1, -1, -1] .
我找到**c*qv**,给出:

out1 = [6, 5, 3, 9, 8, 0, -1, -2, -4, -7]

问题:out1保存了正确的值,但我需要它们按照原始顺序(如在p中找到的)。如何实现这一点?我需要得到:

out2 = [6, 5, 3, -2, 9, -1, 0, 8, -7, -4]
4xrmg8kj

4xrmg8kj1#

您可以重复使用p1p2,它们保存原始位置信息。

out2 = np.zeros_like(out1)
out2[p1] = out1[:5]
out2[p2] = out1[5:]

print(out2)
# [ 6  5  3 -2  9 -1  0  8 -7 -4]

也可以使用qi来达到类似的效果,而且更加整洁。

out2 = np.zeros_like(out1)
out2[qi] = out1

如果您不想创建out2,请使用np.put

np.put(out1, qi, out1)

print(out1)
# [ 6  5  3 -2  9 -1  0  8 -7 -4]

二维病例

对于2D版本的问题,我们将使用类似的想法,但一些技巧同时索引。

p = np.array([[1, 0, 3, 2, 5, 4, 7, 6, 9, 8],
              [6, 5, 3, 2, 9, 1, 0, 8, 7, 4],
              [9, 8, 5, 7, 6, 2, 4, 3, 1, 0]])

c = np.array([1, 1, 1, 1, 1,  -1, -1, -1, -1, -1])

p0 = np.arange(10)              # this is equivalent to p[p] in 1D
p1_r, p1_c = np.where(p0 < p)   # save both row and column indices
p2 = p[p1_r, p1_c]

# We will maintain row and column indices, not just qi
qi_r = np.hstack([p1_r.reshape(-1, 5), p1_r.reshape(-1, 5)]).ravel()
qi_c = np.hstack([p1_c.reshape(-1, 5), p2.reshape(-1, 5)]).ravel()
qv = p[qi_r, qi_c].reshape(-1, 10)
out1 = qv * c

# Use qi_r and qi_c to restore the position
out2 = np.zeros_like(out1)
out2[qi_r, qi_c] = out1.ravel()

print(out2)
# [[ 1  0  3 -2  5 -4  7 -6  9 -8]
#  [ 6  5  3 -2  9 -1  0  8 -7 -4]
#  [ 9  8  5  7  6 -2 -4 -3 -1  0]]

随意打印出每个中间变量,将有助于你理解所发生的一切。

相关问题