【问题标题】:How to iterate through matrix and change it's values?如何遍历矩阵并更改其值?
【发布时间】:2022-01-12 14:00:18
【问题描述】:

我需要用我拥有的一些值构建一个矩阵,但作为一个元组,我有一个字典,其中 vales 是协调器,键只是一个 id,我需要做的是构建一个 5X6 矩阵并附加中的值 我的代码是这样的:

DIC = {1: (0.0, 0.0), 6: (0.0, 0.14), 2: (0.14, 0.0), 7: (0.14, 0.14), 3: (0.28, 0.0), 8: (0.28, 0.14), 4: (0.42, 0.0), 9: (0.42, 0.14), 5: (0.56, 0.0), 10: (0.56, 0.14), 11: (0.0, 0.28), 12: (0.14, 0.28), 13: (0.28, 0.28), 14: (0.42, 0.28), 15: (0.56, 0.28), 16: (0.0, 0.42), 17: (0.14, 0.42), 18: (0.28, 0.42), 19: (0.42, 0.42), 20: (0.56, 0.42), 21: (0.0, 0.56), 22: (0.14, 0.56), 23: (0.28, 0.56), 24: (0.42, 0.56), 25: (0.56, 0.56), 26: (0.0, 0.7), 27: (0.14, 0.7), 28: (0.28, 0.7), 29: (0.42, 0.7), 30: (0.56, 0.71)}    
w, h = 5, 6
position = [[(tuple(DIC[element]) for element in DIC) for x in range(w)] for y in range(h)] 
print(position)

不幸的是,我在运行代码时遇到了这个问题

at 0x7fccc7ff37b0>, <generator object <listcomp>.<listcomp>.<genexpr> at 0x7fccc7ff3820>, <generator object <listcomp>.<listcomp>.<genexpr> at 0x7fccc7ff3890>], [<generator object <listcomp>.<listcomp>.<genexpr> at 0x7fccc7ff3900>, <generator object <listcomp>.<listcomp>.<genexpr> at 0x7fccc7ff3970>, <generator object <listcomp>.<listcomp>.<genexpr> at 0x7fccc7ff39e0>, <generator object <listcomp>.<listcomp>.<genexpr> at 0x7fccc7ff3a50>, <generator object <listcomp>.<listcomp>.<genexpr> at 0x7fccc7ff3ac0>], [<generator object <listcomp>.<listcomp>.<genexpr> at 0x7fccc7ff3b30>, <generator object <listcomp>.<listcomp>.<genexpr> at 0x7fccc7ff3ba0>, <generator object <listcomp>.<listcomp>.<genexpr> at 0x7fccc7ff3c10>, <generator object <listcomp>.<listcomp>.<genexpr> at 0x7fccc7ff3c80>, <generator object <listcomp>.<listcomp>.<genexpr> at 0x7fccc7ff3cf0>]]

有人知道如何获取这些值吗???

【问题讨论】:

  • 问题不清楚:dict中的值应该如何使用?

标签: python arrays dictionary matrix


【解决方案1】:

基于有限的描述,我假设您希望使用字典的索引作为矩阵的索引。如果是这种情况,您的字典似乎没有 0 索引,因此在下面的列表理解中,您需要从 1 开始。

position = [ [ DIC[x*y] for x in range(1, w+1) ] for y in range(1, h+1) ]
position 
[[(0.0, 0.0), (0.14, 0.0), (0.28, 0.0), (0.42, 0.0), (0.56, 0.0)], [(0.14, 0.0), (0.42, 0.0), (0.0, 0.14), (0.28, 0.14), (0.56, 0.14)], [(0.28, 0.0), (0.0, 0.14), (0.42, 0.14), (0.14, 0.28), (0.56, 0.28)], [(0.42, 0.0), (0.28, 0.14), (0.14, 0.28), (0.0, 0.42), (0.56, 0.42)], [(0.56, 0.0), (0.56, 0.14), (0.56, 0.28), (0.56, 0.42), (0.56, 0.56)], [(0.0, 0.14), (0.14, 0.28), (0.28, 0.42), (0.42, 0.56), (0.56, 0.71)]]

【讨论】:

  • 恭喜你拥有一流的读心能力!!
  • thnx,但它并没有做我希望它做的工作 :( 我也会很高兴有 2 个矩阵 x 和 y 以及来自 dic 的 x 和 y 协调器
【解决方案2】:

( x for x in ...) 被理解为生成器。

不需要显式 tuple(),因为你的数据已经是元组了

[[DIC[element] for element in DIC for x in range(w)] for y in range(h)]

这样就可以了

【讨论】:

  • 这并没有真正做到我想要的,在我的 dict 中有 30 个元素,我只需要一个包含 30 个元素的矩阵而不是更多
  • 所以我认为这个问题还不清楚,你在寻找一个 5x6x2 矩阵吗?
【解决方案3】:

您得到的错误是由于在内部理解中使用括号而不是括号引起的:

(tuple(DIC[element]) for element in DIC) 是一个迭代器。

[tuple(DIC[element]) for element in DIC] 是一个列表。

请注意,获取密钥以重新访问字典是不必要的。将值转换为元组也是如此(它们已经是元组)。 list(DIC.values()) 将产生与上述列表理解相同的结果。

除此之外,您想要实现的目标还不清楚。您似乎有元组字典,其键对应于 5x6 矩阵中从 1 开始的位置。如果是这样的话,你可以得到这样的预期结果:

position = [[DIC[r+c+1] for c in range(w)] for r in range(0,w*h,w) ]
print(position)

[[(0.0, 0.0),  (0.14, 0.0),  (0.28, 0.0),  (0.42, 0.0),  (0.56, 0.0)],
 [(0.0, 0.14), (0.14, 0.14), (0.28, 0.14), (0.42, 0.14), (0.56, 0.14)], 
 [(0.0, 0.28), (0.14, 0.28), (0.28, 0.28), (0.42, 0.28), (0.56, 0.28)], 
 [(0.0, 0.42), (0.14, 0.42), (0.28, 0.42), (0.42, 0.42), (0.56, 0.42)], 
 [(0.0, 0.56), (0.14, 0.56), (0.28, 0.56), (0.42, 0.56), (0.56, 0.56)],
 [(0.0, 0.7),  (0.14, 0.7),  (0.28, 0.7),  (0.42, 0.7),  (0.56, 0.71)]]

如果字典中的键不是基于坐标的,而您只想按顺序分配值,则可以在 DIC.values() 上使用迭代器:

iDIC = iter(DIC.values()) 
position = [[next(iDIC) for _ in range(w)] for _ in range(h) ]

这给出了相同的结果,但不依赖于键和位置之间的任何关系(它只依赖于字典中的顺序)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多