Поменяйте местами значения и индексы - PullRequest
0 голосов
/ 07 октября 2019

Интересно, возможно ли это, поэтому у меня есть два 2D-массива:

X[7][9] = 10
Y[7][9] = 5 

Из приведенной выше информации я хочу создать следующие два 2D-массива:

X'[5][10] = 9
Y'[5][10] = 7

Возможно ли эточтобы сделать это? Значения X и Y ограничены и не будут превышать форму X и Y. Также X и Y имеют одинаковую форму.

спасибо заранее.

Ответы [ 2 ]

0 голосов
/ 08 октября 2019
In [147]: X = np.random.randint(0,5,(5,5))                                      
In [148]: Y = np.random.randint(0,5,(5,5))   

Аналогично ответу Мэтта, но с использованием 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]])

Если отображение завершено и один в один, оно можетможно было бы сделать это отображение в целом массиве не итеративным способом, который был бы быстрее, чем это.

0 голосов
/ 07 октября 2019

Вы должны иметь возможность использовать np.nditer для отслеживания мультииндекса и соответствующих значений массивов.

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...