删除numpy数组末尾的dtype

Lon*_*hai 11 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
Run Code Online (Sandbox Code Playgroud)

我的数据文件包含数字行,每个数字都由一个标签相互分隔,例如:

1 2 3
4 5 6
7 8 9
Run Code Online (Sandbox Code Playgroud)

我希望收到如下数组:

array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
Run Code Online (Sandbox Code Playgroud)

但是,结果包含dtype在最后:

array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]], dtype='|S9')
Run Code Online (Sandbox Code Playgroud)

因为它,我无法对结果执行某些操作,例如,如果我尝试使用找到每行的最大值result.max(0),我将收到一个错误:

TypeError:无法使用灵活类型执行reduce.

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

Bi *_*ico 10

最简单的解决方法是使用numpy的loadtxt:

data = numpy.loadtxt(fileName, dtype='float')
Run Code Online (Sandbox Code Playgroud)

仅供参考,numpy.vstack在循环中使用是一个坏主意.如果您决定不使用loadtxt,可以使用以下内容替换循环以修复dtype问题并消除numpy.vstack.

data = [row.split('\t') for row in inputs]
data = np.array(data, dtype='float')
Run Code Online (Sandbox Code Playgroud)

更新

每次调用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)
Run Code Online (Sandbox Code Playgroud)


Aka*_*all 8

以下是您在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]])
Run Code Online (Sandbox Code Playgroud)


Enr*_*ero 6

Numpy数组包含执行此工作的方法:

import numpy as np
a = np.array(['A', 'B'])
a
# Returns: array(['A', 'B'],  dtype='|S1')

a.tolist()
# Returns ['A', 'B']
Run Code Online (Sandbox Code Playgroud)

http://docs.scipy.org/doc/numpy/reference/generation/numpy.ndarray.tolist.html#numpy.ndarray.tolist