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:フレキシブルタイプではreduceを実行できません。

だから、誰かが私のコードの何が問題になっているのか、そしてそれを修正する方法を教えてもらえますか?どうもありがとう。

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 に答える