2013-03-03 74 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

相关问题