Какова цель numpy.Где возвращать кортеж? - PullRequest
0 голосов
/ 01 июня 2018

Когда я запускаю этот код:

import numpy as np
a = np.array([1, 2, 3, 4, 5, 6])
print(np.where(a > 2))

, было бы естественно получить массив индексов, где a > 2, то есть [2, 3, 4, 5], но вместо этого мы получаем:

(array([2, 3, 4, 5], dtype=int64),)

то есть кортеж с пустым вторым членом.

Затем, чтобы получить "естественный" ответ numpy.where, нам нужно сделать:

np.where(a > 2)[0]

Что такоеуказать в этом кортеже?В какой ситуации это полезно?

Примечание: я говорю здесь только о случае использования numpy.where(cond), а не numpy.where(cond, x, y), который также существует (см. Документацию).

Ответы [ 3 ]

0 голосов
/ 01 июня 2018

Для согласованности: длина кортежа совпадает с числом измерений входного массива.

>>> np.where(np.ones((1)) > 0)
(array([0]),)
>>> np.where(np.ones((1,1)) > 0)
(array([0]), array([0]))
>>> np.where(np.ones((1,1,1)) > 0)
(array([0]), array([0]), array([0]))

Создание 1-го случая, возвращающего массив вместо кортежа, приведет к неоднородным возвращаемым типам.Если код вызывающей стороны имеет дело с входными данными произвольной формы, то программисту придется обрабатывать особый случай для 1-го ввода в возвращаемом значении.

0 голосов
/ 01 июня 2018

Из документации np.where

Если задано только условие, верните кортеж condition.nonzero (), индексы, где условие истинно

Итак, мы смотрим в документацию 'np.nonzero'

Возвращает кортеж массивов, по одному для каждого измерения , содержащий индексы ненулевых элементов в этом измерении.Значения в a всегда проверяются и возвращаются в мажорном порядке в C-стиле.Соответствующие ненулевые значения можно получить с помощью:

Так как же это может быть полезным для np.where/np.nonzero, возвращающих кортеж массивов?Я думаю, что это связано с индексированием многомерных массивов .

На примере документации если у нас есть

y = np.arange(35).reshape(5,7)

Мы можем сделать

y[np.array([0,2,4]), np.array([0,1,2])]

, чтобы выбрать y[0, 0], y[2, 1], y[4, 2].

В этом случае, если индексные массивы имеют совпадающую форму, и существует индексный массив для каждого измерения индексируемого массива, результирующий массив имеет ту же формукак индексные массивы, а значения соответствуют индексу, установленному для каждой позиции в индексных массивах.В этом примере первое значение индекса равно 0 для обоих индексных массивов, и, таким образом, первое значение результирующего массива равно y [0,0].Следующее значение - y [2,1], а последнее - y [4,2].

Надеюсь, что индексирование многомерных массивов оправдывает, что np.nonzero/np.where возвращает набор массивов, так что его можно будет использовать для выбора элементов в дальнейшем.

0 голосов
/ 01 июня 2018

numpy.where возвращает кортеж, поскольку каждый элемент кортежа ссылается на измерение.

Рассмотрим этот пример в двух измерениях:

a = np.array([[1, 2, 3, 4, 5, 6],
              [-2, 1, 2, 3, 4, 5]])

print(np.where(a > 2))

(array([0, 0, 0, 0, 1, 1, 1], dtype=int64),
 array([2, 3, 4, 5, 3, 4, 5], dtype=int64))

Как видите, первый элементкортеж относится к первому измерению соответствующих элементов;второй элемент относится ко второму измерению.

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

a = np.array([[1, 2, 3, 4, 5, 6],
              [-2, 1, 2, 3, 4, 5]])

print(a.shape, a.ndim)  # (2, 6) 2

b = np.array([1, 2, 3, 4, 5, 6])

print(b.shape, b.ndim)  # (6,) 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...