2013-03-03 75 views
0

我有一套我想用numpy對待的數據。可以將數據看作空間中的一組點,並使用我想作爲對象處理的附加屬性變量。取決於一組數據,向量可以是長度1,2或3,但對於給定數據集中的所有點而言長度相同。屬性對象是一個自定義類,對於任何兩個給定的點可能都是相同的。作爲一個非唯一屬性的向量的numpy數組

因此,將此數據視爲一個隨機示例(C和H表示包含Carbon或Hydrogen的原子屬性的對象...或僅包含一些隨機對象)。這些不會通過文件讀入,而是通過算法創建。這裏的C對象可以是相同的,也可以是不同的(例如同位素)。

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

我想有一個包含所有原子位置的,這樣我可以執行像numpy的矢量操作和如翻譯功能def translate(data,vec):return data + vec操作的numpy的陣列。我也想平行處理屬性對象。一種選擇是對兩個都有兩個單獨的數組,但是如果我刪除了一個元素,我也必須顯式刪除屬性數組值。這可能難以處理。

我認爲使用numpy.recarray

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

4 「),( 'Z',」 float64" ),( '類型',對象)])

但似乎此數組的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的數組對象,但我覺得這可能是不必要的,並且可能是災難性的。

任何想法或建議將是非常有益的。

回答

2

一個recarray的領域可以是ndarray,如果傳遞的元組(name, type, shape)作爲該領域的D型:

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

+0

謝謝!這正是我一直在尋找的。它向右滑過我,你可以改變其中一個結構的尺寸。 – scicalculator 2013-03-03 22:49:00

1

如果您正在處理原子集合,則可以考慮使用Atomic Simulation Environment (ASE)中的Atoms class。它存儲原子類型,位置和類似列表的方法來操作它們。

+0

感謝您的參考,我不知道它。我實際上是自己建立晶體學和分子可視化/分析/ MD套件。這個軟件包看起來非常強大,並且可以很好地查看其他人在同一區域正在做什麼。我想也可能是可能的合作。 – scicalculator 2013-03-03 23:03:35

+0

這將是一個好主意,看看什麼已經存在,並可能擴大一些用戶羣。這將增加機會,該項目不會結束爲「創建分子可視化/分析工具」的另一個未完成的嘗試...... :-) – 2013-03-04 08:10:49

0

一個快速和骯髒的方法是設置最後(或任何)列是一個數值查找到一個標籤詞典:

>>> 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.]]]) 
+0

謝謝。這絕對可以使用,但是這需要在創建數組之前事先了解整組可能的參考。爲了我的目的,最好有一個非常流暢的方案。 – scicalculator 2013-03-03 22:55:22

相關問題