Конкатенация массивов в цикле for - PullRequest
0 голосов
/ 21 апреля 2019

Я разделил изображение на 16 цифр, чтобы построить регрессию, и теперь я хочу объединить его обратно в одно изображение.

Я написал цикл for, чтобы сделать это, но у меня проблемы с пониманием совета из предыдущих вопросов и о том, где я ошибаюсь.Кто-нибудь может объяснить, почему мои входные массивы не имеют одинаковое количество измерений.

from scipy import interpolate


allArrays = np.array([])
for i in range(len(a)):

    fig = plt.figure()
    ax = fig.add_axes([0.,0.,1.,1.])


    if np.amax(a[i]) > 0:
        x, y = np.where(a[i]>0)
        f = interpolate.interp1d(y, x)
        xnew = np.linspace(min(y), max(y), num=40)
        ynew = f(xnew)   
        plt.plot(xnew, ynew, '-')
        plt.ylim(256, 0)
        plt.xlim(0,256)

        fig.canvas.draw()
        X = np.array(fig.canvas.renderer._renderer)
        myArray = color.rgb2gray(X)
        print(myArray.shape)
        allArrays = np.concatenate([allArrays, myArray])
        print(allArrays.shape)

    else:

        plt.xlim(0,256)
        plt.ylim(0,256)
        fig.canvas.draw()
        X = np.array(fig.canvas.renderer._renderer)
        myArray = color.rgb2gray(X)
        print(myArray.shape)
        allArrays = np.concatenate([allArrays, myArray])
        print(allArrays.shape)




    i += 1  

Вывод: myArray.shape (480, 640)

Сообщение об ошибке: все входные массивы должныимеют одинаковое количество измерений

Я уверен, что это действительно просто, но я не могу понять это.Спасибо.

1 Ответ

2 голосов
/ 21 апреля 2019
In [226]: allArrays = np.array([])                                                   
In [227]: allArrays.shape                                                            
Out[227]: (0,)
In [228]: allArrays.ndim                                                             
Out[228]: 1

In [229]: myArray=np.ones((480,640))                                                 
In [230]: myArray.shape                                                              
Out[230]: (480, 640)
In [231]: myArray.ndim                                                               
Out[231]: 2

1 не равно 2 в большинстве миров!

Чтобы объединить с myArray на оси по умолчанию 0, allArrays должно начинаться с np.zeros((0,640), myArray.dtype).После n итераций он вырастет до (n*480, 640).

В связанном ответе все новые массивы будут 1d, поэтому начинать с фигуры (0,) можно.Но wim's ответ лучше - соберите все массивы в списке и сделайте одну конкатенацию в конце.

Повторную конкатенацию в цикле трудно понять правильно (вы должны понимать формы и размеры), имедленнее, чем добавление в список.

...