14

我正在编写一种从数据文件创建数组的方法。该方法如下所示:

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:无法使用灵活类型执行归约。

那么,谁能告诉我我的代码有什么问题以及如何修复它?非常感谢。

4

4 回答 4

12

最简单的解决方法是使用 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)
于 2012-04-24T02:33:01.660 回答
12

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

于 2016-08-26T16:39:39.073 回答
10

以下是在 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]])
于 2012-04-23T21:55:05.497 回答
3

...您是否尝试先将它们变成数字?

items = [int(x) for x in line.split('\t')]
于 2012-04-23T21:48:17.960 回答