Нужна помощь в переводе формулы матрицы в код Python

Столбцы Pandas DataFrame (или серии) однородно относятся к типу. Вы можете проверить это с помощью dtype (или DataFrame.dtypes):

In [14]: df1[1].dtype
Out[14]: dtype('int64')

In [15]: df2[1].dtype
Out[15]: dtype('float64')

In [16]: df3[1].dtype
Out[16]: dtype('O')

Только общий тип 'object' dtype может содержать любой объект python, и таким образом может также содержать смешанные типы:

In [18]: df2 = pd.DataFrame([[1,.2],[4,3]], dtype='object')

In [19]: df2[1].dtype
Out[19]: dtype('O')

In [20]: map(type,df2[1])
Out[20]: [float, int]

Но это действительно не рекомендуется, так как это побеждает цель (или, по крайней мере, производительность) панд.

Есть ли причина, по которой вы специально хотите как int, так и float в одном столбце?

0
задан BlackBear 16 January 2019 в 12:56
поделиться

1 ответ

Здесь есть одна возможность. Некоторые из предположений в комментариях. Конечно, есть и другие способы сделать это. Размер набора в знаменателе второй формулы можно сделать проще, чем длину набора или списка, но мой способ избегает использования памяти для набора / списка и более согласуется с числителем.

def formula1(X, n, a, b):
    """Return the first formula for matrix X, size n, and indices a and b.
    """
    return sum(X[a][t] - X[b][t] for t in range(1, n+1)) / n

def formula2(X, n, i, j, x, y, a, P):
    """Return the second formula for matrix X, size n, indices i, j, x, and y,
    array or mapping a, array or mapping of sets P.
    """
    numer = sum(abs(X[i][t] - X[j][t])
                for t in range(1, n+1)
                if a[t] in P[x] or a[t] in P[y])
    denom = sum(1
                for t in range(1, n+1)
                if a[t] in P[x] or a[t] in P[y])
    return numer / denom
0
ответ дан Rory Daulton 16 January 2019 в 12:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: