построить матрицу дизайна на питоне

Предположим, у меня есть RxC таблица непредвиденных обстоятельств. Это означает, что есть R строк и C столбцов. Мне нужна матрица X размерности RC × (R + C − 2), которая содержит R − 1 «основных эффектов» для строк и C − 1 «основных эффектов» для столбцов. Например, если у вас есть R=C=2 (R = [0, 1], C = [0, 1]) и только основные эффекты, существуют различные способы параметризации матрицы плана (X), но ниже приведен один из способов:

1 0
0 1
1 0
0 0

Обратите внимание, что это 4 x 2 = RC x (R + C - 2), вы пропускаете один уровень каждой строки и один уровень каждого столбца.

Как я могу сделать это в Python для любого значения R и C, т.е. R = 3, C = 4 ([0 1 2] и [0 1 2 3])? У меня есть только значения R и C, но я могу использовать их для построения массивов, используя np.arange(R) и np.arange(C).


person iwtbid    schedule 29.08.2017    source источник
comment
Можете ли вы объяснить, как R = C = 2 дает вам эту матрицу/массив?   -  person Divakar    schedule 29.08.2017
comment
Возможно, стоит начать с того, что такое таблица непредвиденных обстоятельств или хотя бы ссылка. Мы программисты (во всяком случае, некоторые из нас), а не системные инженеры.   -  person Daniel F    schedule 29.08.2017
comment
Отличное замечание, поправил   -  person iwtbid    schedule 29.08.2017
comment
Каков ожидаемый результат, например, для R=3, C=4? Я не понимаю, как получить основные эффекты по этой ссылке в Википедии, особенно не основываясь только на количестве строк и столбцов. Если вы просто хотите, чтобы пустой массив поместил значения позже, вы можете создать np.empty((R, C, R + C - 2))   -  person Daniel F    schedule 29.08.2017
comment
как насчет np.zeros((R*C, R + C - 2)) ? OP также может захотеть проверить stackoverflow.com/questions/29901436/   -  person tony_tiger    schedule 29.08.2017


Ответы (2)


Следующее должно работать:

R = 3
C = 2

ir = np.zeros((R, C))
ir[0, :] = 1
ir = ir.ravel()

mat = []
for i in range(R):
    mat.append(ir)
    ir = np.roll(ir, C)

ic = np.zeros((R, C))
ic[:, 0] = 1
ic = ic.ravel()

for i in range(C):
    mat.append(ic)
    ic = np.roll(ic, R)

mat = np.asarray(mat).T

и результат:

array([[ 1.,  0.,  0.,  1.,  0.],
       [ 1.,  0.,  0.,  0.,  1.],
       [ 0.,  1.,  0.,  1.,  0.],
       [ 0.,  1.,  0.,  0.,  1.],
       [ 0.,  0.,  1.,  1.,  0.],
       [ 0.,  0.,  1.,  0.,  1.]])

Спасибо всем за вашу помощь!

person iwtbid    schedule 30.08.2017

Используйте LabelBinarizer или One-Hot Encoding для создания матрицы дизайна

Поскольку все его метки находятся в одном столбце, мы можем использовать пакет предварительной обработки sklearns, который имеет LabelBinarizer/One Hot Encoding, который преобразует метки в одном столбце в несколько столбцов, помещая 1 в индексы, в которых это произошло.

Пример NA
PA
PD
NA

После LabelBinarizer
NA PA PD
1 0 0
0 1 0
0 0 1
1 0 0

person psn1997    schedule 16.08.2019
comment
Не могли бы вы уточнить свой ответ? Например, вы должны предоставить пример того, как эти инструменты могут помочь решить проблему, или, по крайней мере, ссылки на дополнительную документацию. - person Richard-Degenne; 16.08.2019