web-dev-qa-db-ja.com

NumPy配列から要素を行単位で選択する方法は?

私はこの派手な配列のような配列を持っています

dd= [[foo 0.567 0.611]
     [bar 0.469 0.479]
     [noo 0.220 0.269]
     [tar 0.480 0.508]
     [boo 0.324 0.324]]

配列をfooを選択してループし、シングルトンとして0.567 0.611をフロートとして取得するにはどうすればよいでしょうか。次に、バーを選択し、シングルトンとして浮動小数点数として0.469 0.479を取得します.....

を使用してリストとして最初の要素のベクトルを取得できます

dv=  dd[:,1]

「foo」および「bar」要素は不明な変数ではなく、変更される可能性があります。

要素が[1]の位置にある場合、どのように変更しますか?

[[0.567 foo2 0.611]
  [0.469 bar2 0.479]
  [0.220 noo2 0.269]
  [0.480 tar2 0.508]
  [0.324 boo2 0.324]]
12
Merlin

あなたの質問にNumPyタグを付けたので、NumPy構文が必要だと仮定します。これは、私の前の回答では使用していません。

実際にNumPyを使用したい場合は、配列内の文字列が不要になる可能性があります。そうでない場合は、浮動小数点数を文字列として表す必要もあります。

あなたが探しているのはNumPy構文で、2D配列の要素に行でアクセスする(そして最初の列を除外する)です。

その構文は次のとおりです。

M[row_index,1:]        # selects all but 1st col from row given by 'row_index'

W/r/t質問の2番目のシナリオ--非隣接列の選択

M[row_index,[0,2]]     # selects 1st & 3rd cols from row given by 'row_index'


質問の小さな複雑さは、row_indexに文字列を使用することだけです。そのため、文字列を削除して(フロートの2D NumPy配列を作成できるようにする)、数値の行インデックスで置き換える必要があります。次にルックアップテーブルを作成して、文字列を数値行インデックスでマップします。

>>> import numpy as NP
>>> # create a look-up table so you can remove the strings from your python nested list,
>>> # which will allow you to represent your data as a 2D NumPy array with dtype=float
>>> keys
      ['foo', 'bar', 'noo', 'tar', 'boo']
>>> values    # 1D index array comprised of one float value for each unique string in 'keys'
      array([0., 1., 2., 3., 4.])
>>> LuT = dict(Zip(keys, values))

>>> # add an index to data by inserting 'values' array as first column of the data matrix
>>> A = NP.hstack((vals, A))
>>> A
        NP.array([  [ 0., .567, .611],
                    [ 1., .469, .479],
                    [ 2., .22, .269],
                    [ 3., .48, .508],
                    [ 4., .324, .324] ])

>>> # so now to look up an item, by 'key':
>>> # write a small function to perform the look-ups:
>>> def select_row(key):
        return A[LuT[key],1:]

>>> select_row('foo')
      array([ 0.567,  0.611])

>>> select_row('noo')
      array([ 0.22 ,  0.269])

質問の2番目のシナリオ:インデックス列が変更された場合はどうなりますか?

>>> # e.g., move index to column 1 (as in your Q)
>>> A = NP.roll(A, 1, axis=1)
>>> A
      array([[ 0.611,  1.   ,  0.567],
             [ 0.479,  2.   ,  0.469],
             [ 0.269,  3.   ,  0.22 ],
             [ 0.508,  4.   ,  0.48 ],
             [ 0.324,  5.   ,  0.324]])

>>> # the original function is changed slightly, to select non-adjacent columns:
>>> def select_row2(key):
        return A[LuT[key],[0,2]]

>>> select_row2('foo')
        array([ 0.611,  0.567])
22
doug

まず、最初の要素のベクトルは

dv = dd[:,0]

(Pythonは0インデックスです)

次に、配列をウォークする(たとえば、dictに格納する)には、次のように記述します。

dc = {}
ind = 0 # this corresponds to the column with the names
for row in dd:
    dc[row[ind]] = row[1:]
3
Foo Bah