python: тестирование массивов и печать имени - PullRequest
0 голосов
/ 04 мая 2018

Я анализирую матрицу структурной структуры (DSM) для зависимостей элементов в производственном процессе. После некоторых матричных операций я получаю два массива, которые являются суммой столбцов и строк полученной матрицы:

SOC = array([1, 2, 2, 3, 3, 4])
SOR = array([6, 2, 3, 1, 2, 1])

Соответствующие позиции в каждом массиве индексируются в массивы для следующих шести элементов (которые соответствуют элементам в матрице исходной структуры проекта (I / O))

A = (SOC[0], SOR[0])
B = (SOC[1], SOR[1])
C = (SOC[2], SOR[2])
D = (SOC[3], SOR[3])
E = (SOC[4], SOR[4])
F = (SOC[5], SOR[5])
ITEM = [A, B, C, D, E, F]

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

cr = []
sh = []
pr = []
ct = []
result = [cr, sh, pr, ct]

for i in ITEM[0:5]:
    if i[0]>3 and i[1]>3:
        cr.append(i)
    if i[0]>3 and i[1]<=3:
        sh.append(i)
    if i[0]<=3 and i[1]<=3:
        pr.append(i)
    if i[0]<=3 and i[1]>3:
        ct.append(i)

результирующий массив почти работает

result = [[], [], [(2, 2), (2, 3), (3, 1), (3, 2)], [(1, 6)]]

Пять из шести пунктов были отсортированы правильно (один отсутствует). Однако в конце мне действительно нужен список ITEMS (имя переменной) и к какой категории они принадлежат. Я видел, что попытка переименовать переменные на основе их определения становится ужасной. Я пытался найти разные синтаксисы для печати результатов, но я не знаю, что я не знаю. Я думал о том, чтобы скопировать элементы ITEM и преобразовать их в строку, а затем напечатать название соответствующего элемента. Я чувствую, что усложняю это дерьмо.

Кто-нибудь может посоветовать более простой способ достижения моей цели?

1 Ответ

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

В переменной Python указаны способы ссылки на объекты, а не имена объектов. Нелегко перейти от объекта к переменной. Также при работе с несколькими объектами более естественно помещать их в списки или словари, а не назначать их переменным.

Я думаю, что это делает ту же классификацию:

In [95]: SOC = np.array([1, 2, 2, 3, 3, 4])
    ...: SOR = np.array([6, 2, 3, 1, 2, 1]) 
In [96]: items = list(zip(SOC,SOR))
In [97]: items
Out[97]: [(1, 6), (2, 2), (2, 3), (3, 1), (3, 2), (4, 1)]
In [98]: result = [[] for _ in range(4)]
    ...: for n,i in enumerate(items):
    ...:     if i[0]>3 and i[1]>3:
    ...:         result[0].append((n,i))
    ...:     if i[0]>3 and i[1]<=3:
    ...:         result[1].append((n,i))
    ...:     if i[0]<=3 and i[1]<=3:
    ...:         result[2].append((n,i))
    ...:     if i[0]<=3 and i[1]>3:
    ...:         result[3].append((n,i))
    ...:         
In [99]: result
Out[99]: 
[[],
 [(5, (4, 1))],
 [(1, (2, 2)), (2, (2, 3)), (3, (3, 1)), (4, (3, 2))],
 [(0, (1, 6))]]

result можно преобразовать в символы с:

In [100]: np.array(list('ABCDEF'))
Out[100]: array(['A', 'B', 'C', 'D', 'E', 'F'], dtype='<U1')
In [101]: [[np.array(list('ABCDEF'))[x[0]] for x in y] for y in result]
Out[101]: [[], ['F'], ['B', 'C', 'D', 'E'], ['A']]

или непосредственно в первом цикле:

In [102]: result = [[] for _ in range(4)]
     ...: for n,i in enumerate(items):
     ...:     if i[0]>3 and i[1]>3:
     ...:         result[0].append('ABCDEF'[n])
     ...:     if i[0]>3 and i[1]<=3:
     ...:         result[1].append('ABCDEF'[n])
     ...:     if i[0]<=3 and i[1]<=3:
     ...:         result[2].append('ABCDEF'[n])
     ...:     if i[0]<=3 and i[1]>3:
     ...:         result[3].append('ABCDEF'[n])
     ...:         
     ...:         
In [103]: result
Out[103]: [[], ['F'], ['B', 'C', 'D', 'E'], ['A']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...