删除numpy数组末尾的dtype

时间:2012-04-23 21:43:21

标签: python arrays numpy

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

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。

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

4 个答案:

答案 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')]