numpy.where()返回不一致的尺寸

时间:2018-06-26 03:41:05

标签: python numpy numpy-broadcasting

我将一个大小为(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 :(得分:2)

我遵循了您的代码,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

输出的转置形式更具可读性,它是带有行列索引对的2D数组:

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))