0

numpyで処理したいデータセットがあります。データは、オブジェクトとして処理したい追加のプロパティ変数を持つ空間内のポイントのセットとして見ることができます。データセットに応じて、ベクトルの長さは1、2、または3になりますが、特定のデータセット内のすべてのポイントで同じ長さになります。プロパティオブジェクトはカスタムクラスであり、任意の2つのポイントで同じである可能性があります。

したがって、このデータをランダムな例と見なしてください(CとHは、炭素または水素の原子特性を含むオブジェクト、または単にランダムなオブジェクトを表します)。これらはファイルを介して読み込まれるのではなく、アルゴリズムによって作成されます。ここで、Cオブジェクトは同じでも異なっていてもかまいません(たとえば、同位体)。

Example 3D data set (just abstract representation)
C 1 2 3
C 3 4 5
H 1 1 4

ベクトル操作や変換関数などのnumpy演算を実行できるように、すべての原子位置を含むnumpy配列が必要def translate(data,vec):return data + vecです。また、プロパティオブジェクトを並行して処理したいと思います。1つのオプションは、両方に2つの別々の配列を設定することですが、1つの要素を削除する場合は、プロパティ配列の値も明示的に削除する必要があります。これは処理が難しくなる可能性があります。

使用を検討しましたnumpy.recarray

x = np.array([(1.0,2,3, "C"), (3.0,2,3, "H")], dtype=[('x', "float64" ),('y',"float6

4 ")、('z'、" float64 ")、('type'、object)])

しかしshape、この配列のは(2,)であるように見えます。これは、各レコードが独立して処理されることを意味します。また、このタイプでベクトル操作を機能させる方法を理解できないようです。

def translate(data,vec):return data + vec
translate(x,np.array([1,2,3]))
...
TypeError: unsupported operand type(s) for +: 'numpy.ndarray' and 'numpy.ndarray'

numpy.recarray私が使うべきものは何ですか?object要素が削除された場合にリンクされる並列配列を持つポイントの個別の数値行列を作成するなど、これをより簡単な方法で処理するためのより良い方法はありますか( np.delete)?また、拡張する配列オブジェクトを作成することも簡単に検討しましたがndarray、これは不要であり、壊滅的な可能性があると感じています。

どんな考えや提案も非常に役に立ちます。

4

3 に答える 3

2

(name, type, shape)フィールドのdtypeとしてタプルを渡す場合、recarrayのフィールドはndarrayにすることができます。

In [9]:

import numpy as np

x = np.array([((1.0,2,3), "C"), ((3.0,2,3), "H")], dtype=[('xyz', "float64", (3,)), ('type', object)])

In [11]:

np.delete(x, 0)

Out[11]:

array([([3.0, 2.0, 3.0], 'H')], 
      dtype=[('xyz', '<f8', (3,)), ('type', 'O')])

In [12]:

x["xyz"]

Out[12]:

array([[ 1.,  2.,  3.],
       [ 3.,  2.,  3.]])

In [14]:

x["xyz"] + (10, 20, 30)

Out[14]:

array([[ 11.,  22.,  33.],
       [ 13.,  22.,  33.]])

翻訳機能の場合:

def translate(data,vec):
    tmp = data.copy()
    tmp["xyz"] += vect
    return tmp

より柔軟な関数が必要な場合は、の使用を検討してPandas.DataFrameください。

于 2013-03-03T13:16:57.827 に答える
1

アトムのコレクションを扱っている場合は、Atomic Simulation Environment(ASE)のAtomsクラスの使用を検討してください。アトムのタイプ、位置を格納し、それらを操作するためのリストのようなメソッドがあります。

于 2013-03-03T12:56:59.620 に答える
0

迅速で汚い方法の1つは、最後の(または実際には任意の)列をラベル辞書への数値ルックアップに設定することです。

>>> import numpy
>>> labels = ['H', 'C', 'O']
>>> labels_refs = dict(zip(labels, numpy.arange(len(labels), dtype='float64')))
>>> reverse_labels_refs = dict(zip(numpy.arange(len(labels), dtype='float64'), labels))
>>> x = numpy.array([
...     [1.0,2,3, labels_refs['C']], 
...     [3.0,2,3, labels_refs['H']],
...     [2.0,2,3, labels_refs['C']]])
>>> x
array([[ 1.,  2.,  3.,  1.],
       [ 3.,  2.,  3.,  0.],
       [ 2.,  2.,  3.,  1.]])
>>> extract_refs = numpy.vectorize(
...         lambda label_ref: reverse_labels_refs[label_ref])
>>> labels = extract_refs(x[:, -1]) # Turn the last column back into labels
>>> labels
array(['C', 'H', 'C'], 
      dtype='|S8')

(例として)ラベルで行を検索することもできます。

>>> x[numpy.where(x[:,-1] == labels_refs['C']), :-1]
array([[[ 1.,  2.,  3.],
        [ 2.,  2.,  3.]]])
于 2013-03-03T13:00:51.487 に答える