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)
以下是您在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)
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
| 归档时间: |
|
| 查看次数: |
16488 次 |
| 最近记录: |