1

csv ファイルを取得し、このデータを Python の多次元配列にインポートする必要がありますが、データを空の配列に追加した後、配列から「なし」の値を削除する方法がわかりません。

最初に次のような構造を作成しました。

storecoeffs = numpy.empty((5,11), dtype='object')

これは、「なし」が入力された 5 行 x 11 列の配列を返します。

次に、csv ファイルを開き、配列に変換しました。

coeffsarray = list(csv.reader(open("file.csv")))

coeffsarray = numpy.array(coeffsarray, dtype='object')

次に、2 つの配列を追加しました。

newmatrix = numpy.append(storecoeffs, coeffsarray, axis=1)

結果は、「なし」の値とその後に必要なデータが入力された配列です (最初の 2 行は、データの性質に関するアイデアを提供するために示されています)。

array([[None, None, None, None, None, None, None, None, None, None, None,
    workers, constant, hhsize, inc1, inc2, inc3, inc4, age1, age2,
    age3, age4],[None, None, None, None, None, None, None, None, None, None, None,
    w0, 7.334, -1.406, 2.823, 2.025, 0.5145, 0, -4.936, -5.054, -2.8, 0],,...]], dtype=object)

これらの「なし」オブジェクトを各行から削除するにはどうすればよいので、残っているのはデータを含む 5 x11 多次元配列ですか?

4

4 に答える 4

1

単純にnumpy.loadtxt()を使用しない理由:

newmatrix = numpy.loadtxt("file.csv", dtype='object') 

私があなたの質問をよく理解していれば、その仕事をするべきです。

于 2010-08-06T19:47:07.503 に答える
1

s の配列全体を割り当てて、Noneそれに追加するのはなぜですか? あなたが望む配列ではcoeffsarrayありませんか?

編集

おー。を使用しnumpy.reshapeます。

import numpy
coeffsarray = numpy.reshape( coeffsarray, ( 5, 11 ) )
于 2010-08-06T19:31:02.830 に答える
1

空の配列から始めますか?

storecoeffs = numpy.empty((5,0), dtype='object')
于 2010-08-06T19:31:03.870 に答える
1

@Gnibbler の答えは技術的には正しいですが、そもそも初期storecoeffs配列を作成する理由はありません。値をロードして、それらから配列を作成するだけです。ただし、@ Mermoz が指摘したように、ユースケースは numpy.loadtxt() にとって十分に単純に見えます。

それ以上に、なぜオブジェクト配列を使用しているのですか?? それはおそらくあなたが望むものではありません...今、あなたは数値を浮動小数点数ではなく文字列として保存しています!

numpy でデータを処理するには、基本的に 2 つの方法があります。名前付き列に簡単にアクセスしたい場合は、構造化配列 (またはレコード配列) を使用します。「通常の」多次元配列が必要な場合は、float、int などの配列を使用してください。オブジェクト配列には特定の目的がありますが、それはおそらくあなたが行っていることではありません。

例: データを通常の 2D numpy 配列としてロードするだけです (すべてのデータを float として簡単に表現できると仮定します):

import numpy as np
# Note that this ignores your column names, and attempts to 
# convert all values to a float...
data = np.loadtxt('input_filename.txt', delimiter=',', skiprows=1)

# Access the first column 
workers = data[:,0]

データを構造化配列としてロードするには、次のようにします。

import numpy as np
infile = file('input_filename.txt')

# Read in the names of the columns from the first row...
names = infile.next().strip().split()

# Make a dtype from these names...
dtype = {'names':names, 'formats':len(names)*[np.float]}

# Read the data in...
data = np.loadtxt(infile, dtype=dtype, delimiter=',')

# Note that data is now effectively 1-dimensional. To access a column,
# index it by name
workers = data['workers']

# Note that this is now one-dimensional... You can't treat it like a 2D array
data[1:10, 3:5] # <-- Raises an error!

data[1:10][['inc1', 'inc2']] # <-- Effectively the same thing, but works..

データに数値以外の値があり、それらを文字列として処理する場合は、構造化配列を使用し、文字列にするフィールドを指定して、フィールド内の文字列の最大長を設定する必要があります。

サンプルデータから、最初の列のように見えます.「workers」は、文字列として保存したい非数値であり、残りはすべて浮動小数点数のように見えます. その場合、次のようにします。

import numpy as np
infile = file('input_filename.txt')
names = infile.next().strip().split()

# Create the dtype... The 'S10' indicates a string field with a length of 10
dtype = {'names':names, 'formats':['S10'] + (len(names) - 1)*[np.float]}
data = np.loadtxt(infile, dtype=dtype, delimiter=',')

# The "workers" field is now a string array
print data['workers']

# Compare this to the other fields
print data['constant']

csv モジュールの柔軟性が本当に必要な場合 (コンマを含むテキスト フィールドなど)、それを使用してデータを読み取り、適切な dtype を持つ構造化配列に変換できます。

物事が少し明確になることを願っています...

于 2010-08-06T20:10:31.450 に答える