考虑下面所示的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] = 0
和p[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]
1条答案
按热度按时间4xrmg8kj1#
您可以重复使用
p1
和p2
,它们保存原始位置信息。也可以使用
qi
来达到类似的效果,而且更加整洁。如果您不想创建
out2
,请使用np.put:二维病例
对于2D版本的问题,我们将使用类似的想法,但一些技巧同时索引。
随意打印出每个中间变量,将有助于你理解所发生的一切。