45

NumPy構造化配列に変換する必要のある辞書があります。私はarcpy関数を使用しているNumPyArraytoTableので、NumPy構造化配列が機能する唯一のデータ形式です。

このスレッドに基づく:辞書とこのスレッドからnumpy配列への書き込み: Python辞書オブジェクトをnumpy配列に変換する方法

私はこれを試しました:

result = {0: 1.1181753789488595, 1: 0.5566080288678394, 2: 0.4718269778030734, 3: 0.48716683119447185, 4: 1.0, 5: 0.1395076201641266, 6: 0.20941558441558442}

names = ['id','data']
formats = ['f8','f8']
dtype = dict(names = names, formats=formats)
array=numpy.array([[key,val] for (key,val) in result.iteritems()],dtype)

しかし、私は取得し続けますexpected a readable buffer object

以下の方法は機能しますが、愚かであり、実際のデータでは明らかに機能しません。もっと優雅なアプローチがあることを私は知っています、私はそれを理解することができません。

totable = numpy.array([[key,val] for (key,val) in result.iteritems()])
array=numpy.array([(totable[0,0],totable[0,1]),(totable[1,0],totable[1,1])],dtype)
4

5 に答える 5

70

使用できますnp.array(list(result.items()), dtype=dtype)

import numpy as np
result = {0: 1.1181753789488595, 1: 0.5566080288678394, 2: 0.4718269778030734, 3: 0.48716683119447185, 4: 1.0, 5: 0.1395076201641266, 6: 0.20941558441558442}

names = ['id','data']
formats = ['f8','f8']
dtype = dict(names = names, formats=formats)
array = np.array(list(result.items()), dtype=dtype)

print(repr(array))

収量

array([(0.0, 1.1181753789488595), (1.0, 0.5566080288678394),
       (2.0, 0.4718269778030734), (3.0, 0.48716683119447185), (4.0, 1.0),
       (5.0, 0.1395076201641266), (6.0, 0.20941558441558442)], 
      dtype=[('id', '<f8'), ('data', '<f8')])

タプルの中間リスト を作成したくない場合は、list(result.items())代わりに を使用できますnp.fromiter

Python2 の場合:

array = np.fromiter(result.iteritems(), dtype=dtype, count=len(result))

Python3 の場合:

array = np.fromiter(result.items(), dtype=dtype, count=len(result))

リストの使用が[key,val]機能しない理由:

ところで、あなたの試みは、

numpy.array([[key,val] for (key,val) in result.iteritems()],dtype)

仕事に非常に近かった。リスト[key, val]を tupleに変更すると、うまくいきます(key, val)。もちろん、

numpy.array([(key,val) for (key,val) in result.iteritems()], dtype)

と同じことです

numpy.array(result.items(), dtype)

Python2、または

numpy.array(list(result.items()), dtype)

Python3で。


np.arrayタプルとは異なる方法でリストを扱います:ロバート・カーンは説明します:

原則として、タプルは「スカラー」レコードと見なされ、リストは再帰されます。このルールは、numpy.array() がどのシーケンスがレコードで、どれが再帰される他のシーケンスであるかを判断するのに役立ちます。つまり、どのシーケンスが別の次元を作成し、どのシーケンスが原子要素であるか。

(0.0, 1.1181753789488595)はこれらのアトミック要素の 1 つと見なされるため、リストではなくタプルにする必要があります。

于 2013-03-22T21:04:15.840 に答える
2

キーと値を別々の配列に格納することをお勧めします。これはしばしばより実用的です。配列の構造は、構造の配列の完全な代替品です。ほとんどの場合、データのサブセット (この場合はキーまたは値) のみを処理する必要があるため、2 つの配列の 1 つだけを操作する方が、2 つの配列の半分を一緒に操作するよりも効率的です。

ただし、この方法が不可能な場合は、行ではなく列でソートされた配列を使用することをお勧めします。この方法では、2 つの配列を持つのと同じ利点がありますが、1 つだけにパックされます。

import numpy as np
result = {0: 1.1181753789488595, 1: 0.5566080288678394, 2: 0.4718269778030734, 3: 0.48716683119447185, 4: 1.0, 5: 0.1395076201641266, 6: 0.20941558441558442}

names = 0
values = 1
array = np.empty(shape=(2, len(result)), dtype=float)
array[names] = result.keys()
array[values] = result.values()

しかし、私のお気に入りはこれです(より簡単です):

import numpy as np
result = {0: 1.1181753789488595, 1: 0.5566080288678394, 2: 0.4718269778030734, 3: 0.48716683119447185, 4: 1.0, 5: 0.1395076201641266, 6: 0.20941558441558442}

arrays = {'names': np.array(result.keys(), dtype=float),
          'values': np.array(result.values(), dtype=float)}
于 2015-03-07T01:51:50.463 に答える