Индекс вне связанных нескольких участков с делением остальных питонов - PullRequest
0 голосов
/ 01 мая 2018

Я создаю несколько вспомогательных участков из информационного кадра, содержащего результаты реакции (по 70 в каждом информационном кадре), и я хочу нанести на график реакции 12 на 12, чтобы быстро просмотреть их перед тем, как приступить к более тщательному анализу. Поскольку 70/12 оставляет остаток, простая реализация вышла бы за пределы. Я могу решить это, используя выражение «если, еще», но оно не очень элегантно и не эффективно. Я хотел бы знать, был ли более хороший вариант. Размер warDf - 70, имеется в виду размер 130x70. время, pcmean и ncmean имеют размер 130. Я использую библиотеки pandas (pd), numpy (np) и matplotlib.pyplot (plt),

it=int(np.ceil(np.size(warDf)/12))# defining what to loop over
kk=0

for kk in np.arange(0,it): 
    #declaring the subplots 
    fig,axes=plt.subplots(nrows=3,ncols=4,sharex='col',sharey='row')
    #transforming axes in a usable list
    axe_list=[item for sublist in axes for item in sublist]

    # checking that I don't run out of bond
    if (12*kk+12<np.size(warDf)):
        k=0 
        # plotting each graph in its corresponding subplot
        for k in np.arange(0,12):                

            ax=axe_list.pop(0)
            ax.plot(time,meanDf.iloc[:,12*kk+k],label=(meanDf.columns[12*kk+k]),color='blue')
            ax.plot(time,pcmean,color='green')
            ax.plot(time,ncmean,color='red')
            ax.set_ylabel('fluorescence')
            ax.set_xlabel('time/ (s)')
            ax.legend()
    else: # better option??
        k=0
        s2=np.size(warDf)-12*kk
        for k in np.arange(0,s2):
            ax=axe_list.pop(0)
            ax.plot(time,meanDf.iloc[:,12*kk+k],label=(meanDf.columns[12*kk+k]),color='blue')
            ax.plot(time,pcmean,color='green')
            ax.plot(time,ncmean,color='red')
            ax.set_ylabel('fluorescence')
            ax.set_xlabel('time/ (s)')
            ax.legend()

plt.show()

1 Ответ

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

Вы можете использовать функцию min(). Замените все if/else на это:

k=0 # note: you don't have to pre-define k here

s2 = min(np.size(warDf) - 12 * kk, 12) # new part

for k in np.arange(0,s2): # the rest is the same as in the body of the else
    ax=axe_list.pop(0)
    ax.plot(time,meanDf.iloc[:,12*kk+k],label=(meanDf.columns[12*kk+k]),color='blue')
    ax.plot(time,pcmean,color='green')
    ax.plot(time,ncmean,color='red')
    ax.set_ylabel('fluorescence')
    ax.set_xlabel('time/ (s)')
    ax.legend()

Объяснение

У вас сейчас есть

if (12 * kk + 12 < np.size(warDf)):
    s2 = 12 # define s2 as a variable here as well
    for k in np.arange(0, s2):
        # ...
else:
    s2 = np.size(warDf) - 12 * kk 
    for k in np.arrange(0, s2):
        # ...

Переставив этот первый if, мы можем получить:

if (12 < np.size(warDf) - 12 * kk):
    s2 = 12
    # ...
else:
    s2 = np.size(warDf) - 12 * kk
    # ...

Теперь вы можете видеть, что правая часть if и присвоение s2 совпадают. Если 12 меньше, используйте 12. В противном случае, используйте np.size(warDf) - 12 * kk. Это определение min().

...