交换numpy中的值和索引

交换numpy中的值和索引,numpy,Numpy,我想知道这是否可能,因此我有两个二维阵列: X[7][9] = 10 Y[7][9] = 5 X'[5][10] = 9 Y'[5][10] = 7 根据以上信息,我想创建以下两个二维阵列: X[7][9] = 10 Y[7][9] = 5 X'[5][10] = 9 Y'[5][10] = 7 有可能做到这一点吗?X和Y的值是有界的,不会超过X和Y的形状。而且X和Y的形状相同 提前谢谢 您应该能够使用来跟踪数组的值和相应的值 rng = np.random.RandomState(

我想知道这是否可能,因此我有两个二维阵列:

X[7][9] = 10
Y[7][9] = 5 
X'[5][10] = 9
Y'[5][10] = 7
根据以上信息,我想创建以下两个二维阵列:

X[7][9] = 10
Y[7][9] = 5 
X'[5][10] = 9
Y'[5][10] = 7
有可能做到这一点吗?X和Y的值是有界的,不会超过X和Y的形状。而且X和Y的形状相同

提前谢谢

您应该能够使用来跟踪数组的值和相应的值

rng = np.random.RandomState(0)
X = rng.randint(low=0, high=10, size=(10, 10))
Y = rng.randint(low=0, high=10, size=(10, 10))

X_prime = X.copy()
Y_prime = Y.copy()

it = np.nditer([X, Y], flags=['multi_index'])
for x, y in it:
    i, j = it.multi_index
    X_prime[y, x] = j
    Y_prime[y, x] = i
我相信这就是你所期待的结果:

>>> X[7, 9], Y[7, 9]
(3, 9)
>>> X_prime[9, 3], Y_prime[9, 3]
(9, 7)

>>> X[1, 2], Y[1, 2]
(8, 2)
>>> X_prime[2, 8], Y_prime[2, 8]
(2, 1)
与Matt的答案类似,但使用
ndindex
生成索引。生成所有这些值的方法多种多样。在内部,我相信
ndindex
使用
nditer

In [149]: X_,Y_ = np.zeros_like(X)-1,np.zeros_like(Y)-1                         
In [150]: for i,j in np.ndindex(*X.shape): 
     ...:     k,l = X[i,j], Y[i,j] 
     ...:     X_[k,l] = i 
     ...:     Y_[k,l] = j 
     ...:                                                                       
In [151]: X                                                                     
Out[151]: 
array([[2, 4, 3, 4, 2],
       [0, 3, 0, 2, 3],
       [1, 1, 4, 4, 4],
       [2, 1, 2, 2, 0],
       [0, 1, 0, 1, 4]])
In [152]: Y                                                                     
Out[152]: 
array([[1, 2, 1, 3, 0],
       [4, 2, 4, 0, 4],
       [4, 3, 3, 2, 1],
       [0, 3, 0, 2, 2],
       [1, 4, 2, 0, 0]])
In [153]: X_                                                                    
Out[153]: 
array([[-1,  4,  4, -1,  1],
       [ 4, -1, -1,  3,  4],
       [ 3,  0,  3, -1, -1],
       [-1,  0,  1, -1,  1],
       [ 4,  2,  2,  2, -1]])
In [154]: Y_                                                                    
Out[154]: 
array([[-1,  0,  2, -1,  2],
       [ 3, -1, -1,  1,  1],
       [ 2,  0,  3, -1, -1],
       [-1,  2,  1, -1,  4],
       [ 4,  4,  3,  2, -1]])
请注意,对于随机生成的数组,映射未满(值为-1)。如果存在重复项,则最后一个值将替换以前的值

处理重复项-注意
X中的更改

In [156]: for i,j in np.ndindex(*X.shape): 
     ...:     k,l = X[i,j], Y[i,j] 
     ...:     if X_[k,l]==-1: 
     ...:         X_[k,l] = i 
     ...:         Y_[k,l] = j 
     ...:     else: 
     ...:         X_[k,l] += i 
     ...:         Y_[k,l] += j 
     ...:          
     ...:                                                                       
In [157]: X_                                                                    
Out[157]: 
array([[-1,  4,  7, -1,  2],
       [ 4, -1, -1,  5,  6],
       [ 7,  0,  3, -1, -1],
       [-1,  0,  1, -1,  1],
       [ 4,  2,  2,  2, -1]])

如果映射是完整的,并且是一对一的,则可能以整个数组的非迭代方式进行映射,这将比这更快。

您的问题是什么?你想转置数组吗?有点想。这是用于图像处理的,X到X'是原始图像中的像素在转置图像中的位置(坐标)的映射。最好使用
X[7,9]
索引语法给我们一个小样本数组对。这样就更容易生成和测试解决方案。换言之,一个好的答案将包括一个工作示例(这将捕获打字错误和更大的错误);你可以帮我们省下一些准备工作。有没有复制的机会?如果是,如何解决冲突?
np.ndindex
也会生成这些索引(内部使用
nditer
)。