【问题标题】:Accessing only one key in a nested list of dictionaries and plotting it with matplotlib仅访问嵌套字典列表中的一个键并使用 matplotlib 绘制它
【发布时间】:2015-11-01 18:22:56
【问题描述】:

我有一个嵌套的字典列表,创建如下:

N = 30
grid = []
for row in range(N):
   rows = []
   for column in range(N):
      each_cell = {"check": 0, "type": -1}
      rows.append(each_cell)
   grid.append(rows)

类型是我要绘制的类型,值 -1 表示单元格中没有任何内容,而 0,1,2,3 是不同的类型(不是渐变),我想用不同的颜色表示。

我将随机数量的类型放入网格中,如下所示:

import numpy.random as rnd
import matplotlib.pyplot as plt

for i in range (rnd.randint(0, N*N)):
   x = rnd.randint(0, N)
   y = rnd.randint(0, N)
   grid[x][y]['check'] = 1
   if grid[x][y]['check'] == 1:
      grid[x][y]['type'] = rnd.randint(0,4)

我正在尝试用这个来绘制它:

plt.imshow(grid['type'], interpolation = 'nearest', cmap = 'gist_ncar_r')
plt.show()

但显然grid['type'] 并没有只选择我想要的类型,有人知道如何解决这个问题吗?

【问题讨论】:

  • 第二个代码块是否应该在第一个代码块之后运行?我得到IndexError: list index out of range
  • 为避免IndexError: list index out of range,设置xy时应使用rnd.randint(0, N - 1)
  • @mfcovington 是的,当我同时运行它们时,我没有收到错误
  • 如何通过编写grid['check'][x][y]grid['type'][x][y] 来重新排列多数组grid 的索引(以便最终成为字典)?
  • 实际上,您并没有指定使用numpy.random 而不是内置的random。它适用于 numpy 版本,但不是内置版本。

标签: python python-2.7 matplotlib


【解决方案1】:

由于imshow 需要“类数组”,您可以更改数据结构以使其更易于使用。不要使用字典数组,而是使用数组字典。

import numpy.random as rnd
import matplotlib.pyplot as plt

N = 30
grid = {'check': [], 'type': []}

for row in range(N):
    check_rows = []
    type_rows = []
    for column in range(N):
        check_rows.append(0)
        type_rows.append(1)
    grid['check'].append(check_rows)
    grid['type'].append(type_rows)

for i in range (rnd.randint(0, N*N)):
    x = rnd.randint(0, N)
    y = rnd.randint(0, N)
    grid['check'][x][y] = 1
    if grid['check'][x][y] == 1:
        grid['type'][x][y] = rnd.randint(0,4)

plt.imshow(grid['type'], interpolation = 'nearest', cmap = 'gist_ncar_r')
plt.show()

【讨论】:

  • 这似乎工作得很好,非常感谢!这绝对可以更轻松地访问特定的密钥,这正是我想要的 :)
  • @Berci 哈哈抱歉我没完全明白你的意思我对编程很陌生,所以我很抱歉之前没有理解你。
【解决方案2】:

您可以使用列表推导式将您想要的数据放入数组中:

from numpy import *
...
data = array([[grid[i][j]['type'] for j in range(N)] for i in range(N)])

要使用array,您需要执行numpy 导入。

然后您可以像尝试那样绘制它:

matplotlib.pyplot.imshow(data, interpolation = 'nearest', cmap = 'gist_ncar_r')
matplotlib.pyplot.show()

【讨论】:

  • 这看起来像我需要的,但我得到了NameError: name 'array' is not defined
猜你喜欢
  • 2013-01-19
  • 1970-01-01
  • 1970-01-01
  • 2018-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多