【问题标题】:making histogram from a csv file从 csv 文件制作直方图
【发布时间】:2012-02-03 10:13:45
【问题描述】:

我正在尝试从 csv 文件中读取一列数据并为其创建直方图。我可以将数据读入数组,但无法制作直方图。这是我所做的:

thimar=csv.reader(open('thimar.csv', 'rb'))
thimar_list=[]
thimar_list.extend(thimar)
z=[]
for data in thimar_list:
    z.append(data[7])
zz=np.array(z)
n, bins, patches = plt.hist(zz, 50, normed=1)

这给了我错误:

TypeError: cannot perform reduce with flexible type

知道发生了什么吗?

【问题讨论】:

  • 您可能需要将字符串转换为数字。我认为 csv.reader 只是创建字符串列表,而 numpy 创建字符串数组
  • 你需要使用csv吗?我认为np.loadtxt 会在这里做得更好(更简单的代码、自动转换等)。
  • 我尝试使用 csv 而不是 loadtxt,因为它可以更好地处理非数字字段,例如列标签。但是如果 csv 只有数字 loadtxt 是一个不错的选择。
  • @Bago - 仅供参考,您可以指定 skiprows=1loadtxt 以使其跳过列标题。但是,csv 模块将处理包含逗号等带引号字符串的 csv 文件。loadtxt (故意)未设置为处理非简单分隔符。

标签: arrays csv numpy histogram


【解决方案1】:

这里有两个选项,如果您的所有列都由数字组成,这个选项将起作用:

array = np.loadtxt('thimar.csv', 'float', delimiter=',')
n, bins, patches = plt.hist(array[:, 7], 50, normed=1)

如果您的文件中有非数字列(即姓名、性别...),则此选项会更好:

thimar = csv.reader(open('thimar.csv', 'rb'))
thimar_list = list(thimar)
zz = np.array([float(row[7]) for row in thimar_list])
n, bins, patches = plt.hist(zz, 50, normed=1)

【讨论】:

    【解决方案2】:

    修改第六行将字符串转换为数字

        z.append(float(data[7]))
    

    有了这个,我用我的虚构数据得到了一些情节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-24
      • 2021-12-09
      • 2016-07-03
      • 2015-04-21
      • 1970-01-01
      • 1970-01-01
      • 2014-12-06
      相关资源
      最近更新 更多