numpy.where () возвращает несовместимые измерения - PullRequest
0 голосов
/ 26 июня 2018

Я передаю массив размера (734,814,3) в функцию, но numpy.where () дает одномерный результат вместо двумерного, который он должен для двумерного массива

def hsi2rgb(img):
    img_rgb = np.empty_like(img)
    h = img[:,:,0] #(734,814)
    s = img[:,:,1] #(734,814)
    i = img[:,:,2] #(734,814)
    l1 = 0.00
    l2 = 2*3.14/3
    l3 = 4*3.14/3
    l4 = 3.14
    r1 = np.where(np.logical_and(h>=l1, h<l2)) #(99048,)
    r2 = np.where(np.logical_and(h>=l2, h<l3))
    r3 = np.where(np.logical_and(h>=l3, h<l4))
    hs = h[r1]
    return img_rgb

Показано, что r1 является перебором, а r1 [0], r1 [1] имеют размер 99048, что не должно иметь место.r1 должен иметь индексы строк и столбцов тех значений, которые удовлетворяют условию.Я попробовал это без логического и, используя только одно условие, но проблема сохраняется.

1 Ответ

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

Я следовал вашему коду, а np.where вернул ожидаемый результат: кортеж с двумя одномерными массивами, содержащий индексы, в которых выполняется условие:

import numpy as np
h = np.random.uniform(size=(734, 814))
r1 = np.where(np.logical_and(h >= 0.1, h < 0.9))
print(r1[0].shape, r1[1].shape)    # (478129,) (478129,)

Это означает, что 478129 элементов удовлетворяют условию.Для каждого из них r1 [0] будет иметь индекс строки, а r1 1 - индекс столбца.А именно, если r1 выглядит как

(array([  0,   0,   0, ..., 733, 733, 733]), array([  0,   1,   2, ..., 808, 809, 811]))

, то я знаю, что h[0, 0], h[0, 1], h[0, 2] и т. Д. Удовлетворяют условиям: индекс строки происходит из первого массива, индекс столбцасо второго.Эта структура может быть менее читаемой, но ее можно использовать для индексации массива h.

Транспонированная форма вывода более читабельна, так как представляет собой двумерный массив с индексными парами строка-столбец:

array([[  0,   0],
       [  0,   1],
       [  0,   2],
       ...,
       [733, 808],
       [733, 809],
       [733, 811]])

Его можно получить путем транспонирования r1 (если вам нужнотакже r1) или напрямую с np.argwhere:

r1 = np.argwhere(np.logical_and(h >= 0.1, h < 0.9))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...