【问题标题】:Vectorization in python in the following code以下代码中python中的向量化
【发布时间】:2016-03-05 05:22:10
【问题描述】:

我正在尝试绘制甘特图。我是 python 新手,不熟悉高级编程概念。在运行代码时,我得到了显示的错误。

import numpy as np
import matplotlib as mpl
import pylab as plt

arr=np.loadtxt('gantt.csv',dtype=float,delimiter=",")

colormapd = {
    1:"r",
    2:"g",
    3:"b",
    4:"y",
    5:"m",
    6:"k",
    7:"r",
    8:"g",
    9:"b",
    0:"y",
    }  

therange=range(500,2500)

jobnum= arr[therange,0].astype(int)
macnum= arr[therange,2].astype(int)
procstart = arr[therange,3]
procfinish = arr[therange,4]


for i in range(500,2500):
    plt.hlines(macnum[i],procstart[i],procfinish[i],colors = colormapd[1])
    plt.show()

错误:

IndexError: index 2000 is out of bounds for axis 0 with size 2000

我认为我需要的是能够对用于访问字典的数组进行矢量化 (jobnum%10)。

plt.hlines(macnum,procstart,procfinish,colors = colormapd[jobnum%10])

我能跑:

plt.hlines(macnum,procstart,procfinish)

但我希望根据工作编号更改线条的颜色。我有 2500 多个工作岗位。任何其他创建甘特图的方法,如果更好,也可以建议。

【问题讨论】:

  • 你试过用for i in range(2000):替换for i in range(500,2500):吗?

标签: python numpy matplotlib vectorization gantt-chart


【解决方案1】:

您的数组的索引是 0-1999,而不是 500-2499。因此,当 for 循环达到 2000 时,索引超出了数组的末尾。

要设置单个颜色,请传入一个数组,其中包含与数据对应的颜色。像这样:

colors = np.array([colormapd[i%10] for i in therange])

for i in range(50,250):
    plt.hlines(macnum,procstart,procfinish,colors=colors)
    plt.show()

【讨论】:

  • color_mapper = np.vectorize(lambda x: {1:"r", 2:"g", 3:"b", 4:"y", 5:"m", 6: "k", 7:"r", 8:"g", 9:"b", 0:"y",}.get(x)) plt.hlines(macnum,procstart,procstart+proctime,colors = color_mapper (jobnum%10)) 这对我有用。
【解决方案2】:

您能否在问题中包含完整的回溯,不清楚您的代码在哪一行失败。

您也可以发布您的 csv 文件和数组的一部分的 sn-p。

话虽如此, 如果您的 csv 文件中有 2000 个项目,那么您的第一个项目的索引将为 0,而您的最后一个 1999 年

数组中的第 2000 项实际上位于索引 1999 处,因为数组索引从 0 开始。

也使用 numpy.arange(start,end) 而不是 python 本机范围。并记住 arange 和 range 不包括端点。

这是一些示例代码

macnum = np.arange(5,26)
procstart = np.linspace(0.0,23.5,21)
procend = procstart + .5

print macnum, len(macnum)
print procstart, len(procstart)
print procend, len(procend)

plt.hlines 的前三个参数可以采用数组,因此只需将数组直接传递给函数即可。

plt.hlines(macnum, procstart, procend)
plt.show()

matplotlib 有内置的颜色图,但我还不完全确定如何使用它们。

【讨论】:

  • 谢谢。我是 python 的新手,我忘记了“端点”不包括在内。它现在有效。我确实将它们作为数组传递并且它有效。但我想为每项工作赋予不同的颜色,因此苦苦挣扎。
猜你喜欢
  • 1970-01-01
  • 2015-07-29
  • 2019-04-25
  • 1970-01-01
  • 2017-10-13
  • 1970-01-01
  • 2019-03-01
  • 1970-01-01
相关资源
最近更新 更多