Python: отображение между двумя массивами с индексным массивом - PullRequest
0 голосов
/ 03 мая 2018

У меня есть массив NumPy

src = np.random.rand(320,240)

и другой массив numpie idx размера (2 x (320 * 240)). Каждый столбец idx индексирует запись в массиве результатов dst, например, idx[:,20] = [3,10] ссылается на строку 3, столбец 10 в dst, и предполагается, что 20 соответствует сглаженному индексу src, т. е. idx устанавливает соответствие между записями src и dst. Предполагая, что dst инициализируется со всеми нулями, как я могу скопировать записи в src по назначению в dst без цикла?

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Вот канонический способ сделать это:

>>> import numpy as np
>>> 
>>> src = np.random.rand(4, 3)
>>> src
array([[0.0309325 , 0.72261479, 0.98373595],
       [0.06357406, 0.44763809, 0.45116039],
       [0.63992938, 0.6445605 , 0.01267776],
       [0.76084312, 0.61888759, 0.2138713 ]])
>>> 
>>> idx = np.indices(src.shape).reshape(2, -1)
>>> np.random.shuffle(idx.T)
>>> idx
array([[3, 3, 0, 1, 0, 3, 1, 1, 2, 2, 2, 0],
       [1, 2, 2, 0, 1, 0, 1, 2, 2, 1, 0, 0]])
>>> 
>>> dst = np.empty_like(src)
>>> dst[tuple(idx)] = src.ravel()
>>> dst
array([[0.2138713 , 0.44763809, 0.98373595],
       [0.06357406, 0.63992938, 0.6445605 ],
       [0.61888759, 0.76084312, 0.01267776],
       [0.45116039, 0.0309325 , 0.72261479]])

Если вы не можете быть уверены, что idx - правильное перемешивание, то немного безопаснее использовать np.full со значением заполнения, которое не отображается в src вместо np.empty.

>>> dst = np.full_like(src, np.nan)
>>> dst[tuple(idx)] = src.ravel()
>>> 
>>> dst
array([[0.27020869, 0.71216066,        nan],
       [0.63812283, 0.69151451, 0.65843901],
       [       nan, 0.02406174, 0.47543061],
       [0.05650845,        nan,        nan]])

Если вы указали значение заполнения в dst, с idx.

что-то не так.
0 голосов
/ 03 мая 2018

Вы можете попробовать:

dst[idx[0, :], idx[1, :]] = src.flat

In [33]: src = np.random.randn(2, 3)

In [34]: src
Out[34]: 
array([[ 0.68636938,  0.60275041,  1.26078727],
       [ 1.17937849, -1.0369404 ,  0.42847611]])

In [35]: dst = np.zeros_like(src)

In [37]: idx = np.array([[0, 1, 0, 1, 0, 0], [1, 2, 0, 1, 2, 0]])

In [38]: dst[idx[0, :], idx[1, :]] = src.flat

In [39]: dst
Out[39]: 
array([[ 0.42847611,  0.68636938, -1.0369404 ],
       [ 0.        ,  1.17937849,  0.60275041]])

dst [0, 1] - это src [0, 0] и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...