Найти индексы минимального значения в массиве, где те же индексы указывают на ноль в другом массиве - PullRequest
0 голосов
/ 13 сентября 2018

Вот мой код:

import numpy as np

OPEN = np.full((10, 2), np.inf)
CLOSED = np.zeros_like(OPEN, dtype = np.int)

OPEN[0][0] = 0.0
OPEN[0][1] = 1.0
OPEN[1][0] = 1.0
CLOSED[0][0] = 1

print("OPEN:")
print(OPEN)
print("")
print("CLOSED:")
print(CLOSED)
print("-------")

# Some magic here:

# Expected output:
print("Expected Output:")
print("[1, 0] or [0, 1]")
print("-------")

# Useful function - find the minimum value in an array:
min_in_OPEN = np.unravel_index(OPEN.argmin(), OPEN.shape)
min_in_OPEN = [min_in_OPEN[0],
               min_in_OPEN[1]] # just foe better representation

print("Current Output:")
print(min_in_OPEN)

И это вывод кода:

OPEN:
[[ 0.  1.]
 [ 1. inf]
 [inf inf]
 [inf inf]
 [inf inf]
 [inf inf]
 [inf inf]
 [inf inf]
 [inf inf]
 [inf inf]]

CLOSED:
[[1 0]
 [0 0]
 [0 0]
 [0 0]
 [0 0]
 [0 0]
 [0 0]
 [0 0]
 [0 0]
 [0 0]]
-------
Expected Output:
[1, 0] or [0, 1]
-------
Current Output:
[0, 0]

Как объясняется кодом, мне нужно получить индексы минимального значения в массиве «ОТКРЫТО», где те же индексы, что и в списке ЗАКРЫТО, указывают на «0», а не «1»

Значения в списке ОТКРЫТО не могут быть изменены на другие значения / типы данных, но значения в списке ЗАКРЫТО - могут. Например, список CLSOED тоже может выглядеть так:

[[ True False]
 [False False]
 [False False]
 [False False]
 [False False]
 [False False]
 [False False]
 [False False]
 [False False]
 [False False]]

1 Ответ

0 голосов
/ 13 сентября 2018

Вы можете сделать это, ограничив свой первый массив (OPEN) позициями, где условие, для которого вы хотите, чтобы ваш второй массив (CLOSED) был истинным:

constrained = OPEN[CLOSED!=1]

, а затем найдите первую позициюминимальное значение с argmin():

pos = constrained.argmin()

Единственная проблема с этим состоит в том, что constrained является одномерным массивом, что означает, что вам нужно отобразить pos обратно на индексную пару в исходной OPEN.Вы можете сделать это, используя np.where(), который возвращает вам кортеж индексных массивов, где выполняется определенное условие:

valid_positions = np.where(CLOSED!=1)

Превращение этого кортежа в массив и индексация его с помощью pos дает вам индекспара, которая соответствует pos:

idx = np.asarray(valid_positions)[:,pos]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...