2

numpy 配列内の要素を取得し、ループでサイズ変更することについて質問があります。

基本的な問題は、(x,y) 形式の時系列があり、y 値が欠落している要素がいくつかあるため、長さ 1 としてプログラムに読み込まれることです。

例: [x,y] [x,y] [x] [x,y]

したがって、これらの時折のポイントを取得して、それらを標準 (1,2) にサイズ変更する必要があります (その後、分布に基づいてポイントを生成しますが、それは問題ではありません)。numpy.resize 関数を認識していますが、試してみると:

for element in list:
   if len(element)==1:
      element=n.resize(element,(1,2))

ループの範囲内で機能しますが、リストを出力すると、すべての要素はループが発生しなかった場合と同じになります。サイズ変更関数は配列を返すため、リストの要素をその配列に等しく設定しても機能しない理由がわかりません。

編集:通常のpythonリストを使用して簡単な解決策を見つけました:

for element in list:
    if len(element)==1:
       element.append(0)

しかし、要素を何かに等しく設定することは確かに可能であるため、上記が機能しない理由についてはまだ興味があります。または、要素 [i] を [1,x] 配列内の何かに等しく設定することしかできませんか?

4

2 に答える 2

2

では、古いの結果でelement=n.resize(element, (1,2))ある新しいオブジェクトを実際に作成していますが、この新しいオブジェクトで何もしていないため、変更が失われます。elementnp.resizeelement

を行うと、その場でelement.append(0)変更elementしているため、まだ初期オブジェクトを参照しており、変更が保存されます。

とは言っても、 a に欠落している要素を処理するより良い方法がありますndarray。お気づきのように、これらの要素のすべてが 2 つの項目のシーケンスではない場合(N,2)、要素のリストから配列を作成することはできません。何らかの方法でギャップを埋める必要があります。N初期データがテキスト ファイルから取得された場合、パラメータを使用np.genfromtxtして次のファイルを作成できます。usemask=TrueMaskedArray

>>> data = StringIO.StringIO("1,2\n3,4\n,6\n7,\n")
>>> x = np.genfromtxt(data, delimiter=",", usemask=True)
>>> x
masked_array(data =
 [[1.0 2.0]
 [3.0 4.0]
 [-- 6.0]
 [7.0 --]],
             mask =
 [[False False]
 [False False]
 [ True False]
 [False  True]],
       fill_value = 1e+20)

np.ma.masked最初のギャップは、あなたにとって特別な価値で埋められました。

于 2012-09-28T08:13:58.767 に答える
0

element=...要素が参照するオブジェクトを変更していないと言うときはelement、新しいオブジェクトを参照していることになります。append要素を呼び出すと、実際にオブジェクトを変更していることになります。

于 2012-09-28T00:17:54.233 に答える