删除NumPy数组末尾的dtype。

20

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

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个回答

15

1
然后需要将该列表再次转换为数组,方法如下... list = array_with_dtype.tolist(), arr = np.array(list) - DOT

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)

1
谢谢,你的代码运行得非常好。但是你能解释一下为什么在循环中使用numpy.vstack不是一个好主意吗?谢谢。 - Long Thai

11

以下是如何在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]])

4

你是否尝试先将它们转换为数字?

items = [int(x) for x in line.split('\t')]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接