Изменение формы массивов с помощью Numpy.Reshape - PullRequest
0 голосов
/ 09 декабря 2018

Я пытаюсь изменить форму массива с помощью numpy.reshape, но всегда сталкиваюсь с ошибкой индекса

"IndexError: index 15484 is out of bounds for axis 0 with size 7231"

Затем я распечатал форму массива, которая была

(7231,80,60,4)

Мой код

X = np.array([i[0] for i in train]).reshape(-1,80,60,1)

(я пытаюсь изменить все мое изображение до (-1,80,60,1))

Я думал, что -1 автоматически завершил измерения, поэтому яне понимаете, почему я получаю эту ошибку?

train is:

    train = train_data[:-500]

, а train_data представляет собой массив с кортежами пикселей изображения и метками

Может кто-нибудь мне помочь

Ответы [ 3 ]

0 голосов
/ 10 декабря 2018

Изменение формы массива (7231,80,60,4) -> (-1,80,60,1) «просто работает»:

train = np.arange(np.prod((7231,80,60,4))).reshape(7231,80,60,4)
print(train.shape)

X = train.reshape(-1,80,60,1)
print(X.shape)

Вывод:

(7231, 80, 60, 4)
(28924, 80, 60, 1)

Поэтому проблемы, с которыми вы столкнулись, должныне напрямую зависит от того, что вы пытаетесь изменить.Я предполагаю, что ваша проблема может быть связана с формой / содержимым вашего массива train_data (или массива, который вы пытаетесь создать из него с помощью np.array([i[0] for i in train])).Конечно, проблема также может быть в разделе кода, который вы не опубликовали в своем вопросе.Вероятно, было бы полезно, если бы вы опубликовали немного больше своего фактического кода.

В частности, когда вы получили сообщение об ошибке:

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

оно должно было включать трассировку стека, которая указываланепосредственно к проблемной строке в вашем коде.Трассировка стека говорит, что ошибка возникла из строки, в которой вы создаете X:

X = np.array([i[0] for i in train]).reshape(-1,80,60,1)

, или она указала на другую строку в вашем коде?

0 голосов
/ 10 декабря 2018

Будьте осторожны при изменении формы.Даже если это работает, расположение элементов может быть не тем, что вы хотите.

Начните с простого массива, который мы можем визуализировать:

In [805]: x = np.arange(24).reshape(3,2,4)
In [806]: x
Out[806]: 
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7]],

       [[ 8,  9, 10, 11],
        [12, 13, 14, 15]],

       [[16, 17, 18, 19],
        [20, 21, 22, 23]]])

изменить на (-1,2,1) - но давайте отбросим последнюю 1 для более компактного отображения:

In [807]: x.reshape(-1,2)
Out[807]: 
array([[ 0,  1],
       [ 2,  3],
       [ 4,  5],
       [ 6,  7],
       [ 8,  9],
       [10, 11],
       [12, 13],
       [14, 15],
       [16, 17],
       [18, 19],
       [20, 21],
       [22, 23]])

Обратите внимание, как исходная строка [0,1,2,3] разбивается на 2 строки.

Другаяспособ перераспределения последнего измерения размера 4:

In [808]: np.vstack([x[...,i] for i in range(4)])
Out[808]: 
array([[ 0,  4],
       [ 8, 12],
       [16, 20],
       [ 1,  5],
       [ 9, 13],
       [17, 21],
       [ 2,  6],
       [10, 14],
       [18, 22],
       [ 3,  7],
       [11, 15],
       [19, 23]])

Это может быть понятнее, если мы использовали np.stack и получили (4,3,2) форму

array([[[ 0,  4],
        [ 8, 12],
        [16, 20]],
  ....

x.transpose(2,0,1) производит то же самое.

reshape сохраняет упорядоченный / уплощенный порядок элементов.Транспонировать изменения.

In [812]: x.transpose(2,0,1).ravel()
Out[812]: 
array([ 0,  4,  8, 12, 16, 20,  1,  5,  9, 13, 17, 21,  2,  6, 10, 14,...])
In [813]: x.reshape(-2,2).ravel()
Out[813]: 
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, ...])
0 голосов
/ 09 декабря 2018

Код, который вы имеете, не делает то, что вы думаете, он делает.i[0] получает 0-й элемент по первой оси, который является вашим 80, это не то, что вы хотите.

В любом случае, что вы на самом деле хотите выбрать первый срез в самом быстром направлении, так чтопросто сделайте:

X = train[:,:,:,0:1]

Если ваши данные на самом деле не соответствуют указанному размеру, попробуйте:

X = np.array([i.reshape(80, 60, 4)[:,:,0:1] for i in train])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...