我需要获取一个csv文件并将这些数据导入到python中的多维数组中,但我不确定在将数据附加到空数组之后如何从数组中删除'None'值
我首先创建了一个这样的结构:
storecoeffs = numpy.empty((5,11), dtype='object')
这将返回由'None'填充的5行×11列数组。
接下来,我打开了我的csv文件并将其转换为数组:
coeffsarray = list(csv.reader(open("file.csv")))
coeffsarray = numpy.array(coeffsarray, dtype='object')
然后,我附加了两个数组:
newmatrix = numpy.append(storecoeffs, coeffsarray, axis=1)
结果是一个数组填充'None'值后跟我想要的数据(显示前两行,让您了解我的数据的性质):
array([[None, None, None, None, None, None, None, None, None, None, None,
workers, constant, hhsize, inc1, inc2, inc3, inc4, age1, age2,
age3, age4],[None, None, None, None, None, None, None, None, None, None, None,
w0, 7.334, -1.406, 2.823, 2.025, 0.5145, 0, -4.936, -5.054, -2.8, 0],,...]], dtype=object)
如何从每一行中删除那些“无”对象,所以我剩下的是带有我的数据的5 x11多维数组?
答案 0 :(得分:1)
为什么要分配整个None
数组并追加? coeffsarray
不是您想要的数组吗?
喔。使用numpy.reshape
。
import numpy
coeffsarray = numpy.reshape( coeffsarray, ( 5, 11 ) )
答案 1 :(得分:1)
从一个空数组开始?
storecoeffs = numpy.empty((5,0), dtype='object')
答案 2 :(得分:1)
答案 3 :(得分:1)
@Gnibbler的答案在技术上是正确的,但是没有理由首先创建初始的storecoeffs
数组。只需加载您的值,然后从中创建一个数组。正如@Mermoz所指出的那样,你的用例对于numpy.loadtxt()看起来很简单。
除此之外,你为什么要使用对象数组?它可能不是你想要的......现在,你将数值存储为字符串,而不是浮点数!
你有两种方法来处理numpy中的数据。如果要轻松访问命名列,请使用结构化数组(或记录数组)。如果你想要一个“普通的”多维数组,只需使用一个浮点数组,整数组等。对象数组有一个特定的目的,但它可能不是你正在做的。
例如: 只需将数据作为普通的2D numpy数组加载(假设您的所有数据都可以轻松地表示为浮点数):
import numpy as np
# Note that this ignores your column names, and attempts to
# convert all values to a float...
data = np.loadtxt('input_filename.txt', delimiter=',', skiprows=1)
# Access the first column
workers = data[:,0]
要将数据作为结构化数组加载,您可以执行以下操作:
import numpy as np
infile = file('input_filename.txt')
# Read in the names of the columns from the first row...
names = infile.next().strip().split()
# Make a dtype from these names...
dtype = {'names':names, 'formats':len(names)*[np.float]}
# Read the data in...
data = np.loadtxt(infile, dtype=dtype, delimiter=',')
# Note that data is now effectively 1-dimensional. To access a column,
# index it by name
workers = data['workers']
# Note that this is now one-dimensional... You can't treat it like a 2D array
data[1:10, 3:5] # <-- Raises an error!
data[1:10][['inc1', 'inc2']] # <-- Effectively the same thing, but works..
如果您的数据中包含非数值并希望将它们作为字符串处理,则需要使用结构化数组,指定要作为字符串的字段,并为字符串中的字符串设置最大长度。领域。
从您的示例数据看,它看起来像第一列,“workers”是一个非数字值,您可能希望将其存储为字符串,其余所有看起来像浮点数。在这种情况下,你会做这样的事情:
import numpy as np
infile = file('input_filename.txt')
names = infile.next().strip().split()
# Create the dtype... The 'S10' indicates a string field with a length of 10
dtype = {'names':names, 'formats':['S10'] + (len(names) - 1)*[np.float]}
data = np.loadtxt(infile, dtype=dtype, delimiter=',')
# The "workers" field is now a string array
print data['workers']
# Compare this to the other fields
print data['constant']
如果您确实需要csv模块的灵活性(例如带逗号的文本字段),您可以使用它来读取数据,然后将其转换为具有相应dtype的结构化数组。
希望让事情更清晰......