Получение индекса минимального значения в каждом срезе `ndarray` - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь сделать что-то, что должно быть простым и может быть выполнено в for-loop , но я пытаюсь избежать этого.

Я хотел бы получить индекс минимального значения в каждом срезе вдоль определенной оси numpy.ndarray, a .Меня больше интересует индекс, чем само значение.Я использую индекс, чтобы получить значение из другого двумерного массива с формой, равной первым двум измерениям a .

Вот наивная реализация, использующая for-loop :

a = np.random.randint(0, 10, 60).reshape(3, 4, 5)
print(a)
for i in range(a.shape[-1]):
    idx = a[..., i].argmin()
    print('Slice:', i, '| Index:', idx, '| min value:',
          a[..., i].flat[idx])

Out:

[[[1 9 4 0 7]
  [6 3 1 6 8]
  [7 8 2 0 2]
  [8 6 1 6 5]]

 [[8 7 0 6 9]
  [7 2 6 4 5]
  [3 4 9 2 9]
  [1 4 8 0 7]]

 [[1 4 6 6 2]
  [9 9 5 6 7]
  [6 2 8 9 9]
  [3 9 8 5 4]]]
Slice: 0 | Index: 0 | min value: 1
Slice: 1 | Index: 5 | min value: 2
Slice: 2 | Index: 4 | min value: 0
Slice: 3 | Index: 0 | min value: 0
Slice: 4 | Index: 2 | min value: 2

Я понимаю, что могу передать аргумент ключевого слова axis в argmin, но это не приводит к результату, который я ищу.

1 Ответ

0 голосов
/ 19 октября 2018

В конкретном случае, указанном в вашем вопросе, вы можете изменить форму массива, а затем использовать argmin:

>>> import numpy as np
>>> a = np.array([[[1, 9, 4, 0, 7],
...   [6, 3, 1, 6, 8],
...   [7, 8, 2, 0, 2],
...   [8, 6, 1, 6, 5]],
...
...  [[8, 7, 0, 6, 9],
...   [7, 2, 6, 4, 5],
...   [3, 4, 9, 2, 9],
...   [1, 4, 8, 0, 7]],
...
...  [[1, 4, 6, 6, 2],
...   [9, 9, 5, 6, 7],
...   [6, 2, 8, 9, 9],
...   [3, 9, 8, 5, 4]]])
>>> a.reshape(-1, a.shape[2]).min(axis=0)
array([1, 2, 0, 0, 2])
>>> a.reshape(-1, a.shape[2]).argmin(axis=0)
array([0, 5, 4, 0, 2])
>>>

. shape[2] исходит из того факта, что это измерение (в данном случаевнутренний размер (или строки), где вы не хотите рассчитать минимум по: вы вычисляете минимум по первым двум измерениям.

Вам также нужен срезчисло: в основном только второй индекс ваших элементов.Это легко, так как этот является последовательным и просто:

slices = np.arange(a.shape[2])
...