我正在编写一个从数据文件创建数组的方法。该方法如下:
import numpy
def readDataFile(fileName):
try:
with open(fileName, 'r') as inputs:
data = None
for line in inputs:
line = line.strip()
items = line.split('\t')
if data == None:
data = numpy.array(items[0:len(items)])
else:
data = numpy.vstack((data, items[0:len(items)]))
return numpy.array(data)
except IOError as ioerr:
print 'IOError: ', ioerr
return None
我的数据文件包含数字行,每行都有一个标签,例如:
1 2 3
4 5 6
7 8 9
我希望收到如下数组:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
但是,结果中包含dtype
:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]], dtype='|S9')
因此,我无法对结果执行某些操作,例如如果我尝试使用result.max(0)
找到每一行的最大值,我会收到错误:
TypeError:无法使用灵活类型执行reduce。
那么,谁能告诉我我的代码有什么问题以及如何修复它?非常感谢。
答案 0 :(得分:10)
最简单的解决方法是使用numpy的loadtxt:
data = numpy.loadtxt(fileName, dtype='float')
仅供参考,在循环中使用numpy.vstack
是一个坏主意。如果您决定不使用loadtxt
,则可以使用以下内容替换循环以修复dtype问题并取消numpy.vstack
。
data = [row.split('\t') for row in inputs]
data = np.array(data, dtype='float')
更新
每次调用vstack时,它都会生成一个新数组,并将旧数组的内容复制到新数组中。这个副本大致是O(n),其中n是数组的大小,如果你的循环运行n次,那么整个东西变成O(n ** 2),换句话说就是慢。如果您提前知道数组的最终大小,最好在循环外创建数组并填充现有数组。如果您不知道数组的最终大小,可以使用循环内的列表并在结尾处调用vstack。例如:
import numpy as np
myArray = np.zeros((10,3))
for i in xrange(len(myArray)):
myArray[i] = [i, i+1, i+2]
# or:
myArray = []
for i in xrange(10):
myArray.append(np.array([i, i+1, i+2]))
myArray = np.vstack(myArray)
答案 1 :(得分:7)
以下是如何更改numpy中的数据类型:
>>> x
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> x.astype('|S9')
array([['1', '2', '3'],
['4', '5', '6'],
['7', '8', '9']],
dtype='|S9')
>>> x.astype('Float64')
array([[ 1., 2., 3.],
[ 4., 5., 6.],
[ 7., 8., 9.]])
>>> x.astype('int')
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
答案 2 :(得分:4)
Numpy数组包含执行此任务的方法:
import numpy as np
a = np.array(['A', 'B'])
a
# Returns: array(['A', 'B'], dtype='|S1')
a.tolist()
# Returns ['A', 'B']
http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.tolist.html#numpy.ndarray.tolist
答案 3 :(得分:3)
...你先尝试将它们变成数字吗?
items = [int(x) for x in line.split('\t')]