交换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
)。