【问题标题】:python: testing arrays and printing the namepython:测试数组并打印名称
【发布时间】:2018-05-04 13:36:56
【问题描述】:

我正在分析设计结构矩阵 (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)]]

六项中有五项排序正确(一项缺失)。但是最后我真正需要的是一个项目列表(变量名)以及它们属于哪个类别。 我已经看到尝试根据变量的定义重命名变量变得丑陋。我一直在尝试寻找不同的语法来打印结果,但我不知道我不知道什么。我想复制数组 ITEM 并将其转换为字符串,然后打印相应的项目标题。我觉得我把这件事复杂化了。

谁能建议一种更简单的方法来实现我的目标?

【问题讨论】:

  • 你能添加你想要得到的输出的样子吗?我觉得和OrderedDict可以帮助你,但想确保我理解你想要什么
  • ITEM = list(zip(SOC, SOR)) 最好创建您的 ITEM 变量,特别是如果 SOC/SOR 很长
  • 缺少一个元素,因为 ITEM[0:5] 不包含 ITEM[5]。
  • 使用for i,v in enumerate(ITEM): 进行迭代。这给出了要测试的元组及其在 ITEM 中的索引。
  • 我正在使用分析来根据矩阵中的关系对不同的项目进行分类。你的回答很有帮助。看起来为了进一步的实现,我需要学习如何使用列表和字典

标签: python arrays numpy indexing


【解决方案1】:

在 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']]

【讨论】:

  • 感谢您的澄清,您已经为我很好地解释了语法!
猜你喜欢
  • 2015-12-08
  • 2011-12-09
  • 2022-11-14
  • 2020-03-24
  • 1970-01-01
  • 2014-11-06
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
相关资源
最近更新 更多