массив пустых индексов выбрасывает исключение - PullRequest
0 голосов
/ 09 мая 2018

Может кто-нибудь указать на ошибку в коде ниже? Последняя строка продолжает выдавать ошибку:

tmp = img1[coords]
IndexError: index 409 is out of bounds for axis 0 with size 352

Я смещаю индексы только на 10, поэтому не понимаю, как внезапно я вышел за пределы в img1

img1 = np.random.randint(0,256, (352,870, 3), dtype=np.uint8)
img2 = np.random.randint(0,256, (44,853, 3), dtype=np.uint8)
coords = np.where(img2[:, :, 2] >= 250)
coords = np.transpose(np.transpose(coords)+(10, 10))
tmp = img1[coords]

Ответы [ 2 ]

0 голосов
/ 09 мая 2018
In [1]: x = np.arange(24).reshape(2,3,4)
In [2]: idx = np.where(x%2)
In [3]: idx
Out[3]: 
(array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1], dtype=int32),
 array([0, 0, 1, 1, 2, 2, 0, 0, 1, 1, 2, 2], dtype=int32),
 array([1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3], dtype=int32))
In [4]: x[idx]
Out[4]: array([ 1,  3,  5,  7,  9, 11, 13, 15, 17, 19, 21, 23])
In [5]: idx1 = np.transpose(np.transpose(idx))
In [6]: idx1
Out[6]: 
array([[0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1],
       [0, 0, 1, 1, 2, 2, 0, 0, 1, 1, 2, 2],
       [1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3]], dtype=int32)

неправильный способ использования idx1:

In [7]: x[idx1]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-7-ffe1818b2257> in <module>()
----> 1 x[idx1]

IndexError: index 2 is out of bounds for axis 0 with size 2

Правильный путь:

In [8]: x[tuple(idx1)]
Out[8]: array([ 1,  3,  5,  7,  9, 11, 13, 15, 17, 19, 21, 23])

Проверьте это с where, взятым на фрагменте x (мне не нравится предполагать, что код работает):

In [22]: idx = np.where(x[:,:,2]%3)
In [23]: idx
Out[23]: (array([0, 0, 1, 1], dtype=int32), array([0, 2, 0, 2], dtype=int32))
In [24]: idx1 = np.transpose(np.transpose(idx))
In [25]: x[idx]
Out[25]: 
array([[ 0,  1,  2,  3],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15],
       [20, 21, 22, 23]])
In [26]: x[tuple(idx1)]
Out[26]: 
array([[ 0,  1,  2,  3],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15],
       [20, 21, 22, 23]])

Индексирование с помощью массива из n строк не совпадает с индексированием с помощью набора из n массивов. Элементы кортежа применяются к последовательным размерам. Элементы массива применяются только к одному измерению, к первому.

0 голосов
/ 09 мая 2018

Не ясно, чего вы пытаетесь достичь, но я предполагаю, что это так: tmp = img1[coords[0], coords[1]]

...