【问题标题】:append data in a numpy array在 numpy 数组中追加数据
【发布时间】:2017-05-17 11:16:31
【问题描述】:

我正在尝试在一个 numpy 数组中传递一个列表,以便按照 here 的解释计算其方差

我使用的例子是这样的:

import numpy as np
A= np.array([])
newrow = [1,2,3]
A = np.concatenate((A,newrow))
print(np.var(A))

上面的例子有效,但是我不能将它应用到我的具体案例中(见下文)

import csv
import numpy as np

f = open("training_stats.csv", 'r')
customers = csv.reader(f)
header = next(customers)

#I've tried with and without the .astype
A = np.array([]).astype(np.float)

for row in customers: 
    birth_date = row[10].split("-")[0]
    print(birth_date)
    A = np.append(A,birth_date)
print np.var(A)

这是返回的错误信息

TypeError: cannot perform reduce with flexible type

这是我的列表的样子:

1963
1975
1957

我知道我可以这样计算方差:

var = mean(abs(x - x.mean())**2)

但是我想了解这个 numpy.array 有什么问题以及我传递给它的数据类型。

【问题讨论】:

  • 你的生日是一个字符串。 Numpy 可能在内部做一个不处理对象数据类型的 reduce。在你的 for 循环之后执行 astype 并查看错误是否仍然存在。
  • @Satyadev 如果我尝试 'A = np.append(A,birth_date).astype(np.int)' 我得到这个 'ValueError: invalid literal for int() with base 10: '' '
  • 您能否提供一个(缩短的)文件样本?可能有一种更简单的方法来提取数据。 :)
  • 我建议将pandas 用于此类任务。它不仅有一个不错的read_csv 模块。它还自动处理不同列中的不同数据类型。

标签: python arrays numpy


【解决方案1】:

数组 A 保存浮点数(如您指定),客户保存字符串。您不能将字符串添加到浮点数组。你应该这样做:A = np.append(A,float(birth_date))

【讨论】:

  • 我也试过这个,但我得到这个错误消息'A = np.append(A,float(birth_date)) ValueError: could not convert string to float: '
  • 我已将您的反馈整合到答案中,谢谢。
【解决方案2】:

在你的 for 循环之后,执行以下操作:

A = A.astype(np.float)

您的 csv 阅读器将值作为字符串读取并转储到 numpy 数组中。即使您声明了一个浮点数组,这些值也是导致问题的字符串。

【讨论】:

  • 它实际上是在创建一个新问题 'ValueError: could not convert string to float:'
  • 您能否在错误出现之前粘贴以下输出:A[0:2]、A.dtype 和 type(A)
  • A[0:2] 返回1962 [ 1980. 1957.] 1948 [ 1980. 1957.] 1961 [ 1980. 1957.] 1949 [ 1980. 1957.] 1946 [ 1980. 1957.] 1960 [ 1980. 1957.] [ 1980. 1957.]
  • 类型(A)返回<type 'numpy.ndarray'>
  • 您的 numpy 数组结构与发布的相关信息不符。例如,尝试以下操作: A = np.append(A,'1967) ,追加一些值并观察 A 的结构。你能从 csv 中发布一些示例信息
【解决方案3】:

经过进一步研究,我的列表中有空行。 为了解决问题,我控制了行的值,如果 != '' 然后我将值添加到 numpy 数组中,现在它可以工作了

import csv
import numpy as np

f = open("training_set.csv", 'r')
customers = csv.reader(f)
header = next(customers)


A = np.array([]).astype(np.int)

for row in customers:
    birth_date = row[10].split("-")[0]
    if birth_date != '':
        A = np.append(A,float(birth_date))
print np.var(A)

【讨论】:

  • 通常我们建议将新值附加到列表中,并在最后将其转换为数组。更轻松、更快捷。
猜你喜欢
  • 2014-11-03
  • 2020-09-23
  • 1970-01-01
  • 1970-01-01
  • 2018-01-14
  • 2016-04-08
  • 2015-02-21
  • 2021-04-15
  • 1970-01-01
相关资源
最近更新 更多