基于对象的属性访问numpy数组

时间:2015-12-15 08:01:01

标签: python numpy

我有一个包含对象列表的numpy数组。

x = np.array([obj1,obj2,obj3])

以下是对象的定义:

class obj():
    def __init__(self,id):
        self.id = id

obj1 = obj(6)
obj2 = obj(4)
obj3 = obj(2)

不是根据对象的位置访问numpy数组,而是想根据id的值访问它。

例如:

# x[2] = obj3
# x[4] = obj2
# x[6] = obj1

在做了一些研究之后,我了解到我可以制作一个结构化数组:

x = np.array([(3,2,1)],dtype=[('2', 'i4'),('4', 'i4'), ('6', 'i4')])

# x['2'] --> 3

然而,问题是我希望数组将整数作为索引,而dtypes必须具有str类型的名称。此外,我不认为结构化数组可以是对象列表。

2 个答案:

答案 0 :(得分:1)

如果您只想访问子索引“by-index”(例如x[2, 4]),索引为id,那么您只需创建自己的结构:

import collections    

class MyArray (collections.OrderedDict):
    def __init__ (self, values):
        super(MyArray, self).__init__ ((v.id, v) for v in values)
    def __rawgetitem (self, key):
        return super (MyArray, self).__getitem__ (key)
    def __getitem__ (self, key):
        if not hasattr (key, '__iter__'):
            key = (key, )
        return MyArray (self.__rawgetitem (k) for k in key)
    def __repr__ (self):
        return 'MyArray({})'.format(', '.join('{}: {}'.format(k, self.__rawgetitem(k)) for k in self.keys()))
>>> class obj():
...     def __init__(self,id):
...         self.id = id
...     def __repr__ (self):
...         return "obj({})".format(self.id)
...
>>> obj1 = obj(6)
>>> obj2 = obj(4)
>>> obj3 = obj(2)
>>> x = MyArray([obj1, obj2, obj3])
>>> x
MyArray({2: obj(2), 4: obj(4), 6: obj(6)})
>>> x[4]
obj(4) 
>>> x[2, 4]
MyArray({2: obj(2), 4: obj(4)})

答案 1 :(得分:0)

你应该可以在这里使用right以及lambda表达式:

var allvalues = $('#allvalues').val();
var spval     = allvalues.split('^');
var arr2      = [];
var arr1      = spval.filter(function(item) {
    if (item.trim().length === 0) return false;
    if (item.split('|').join('').slice(-4) === "0000") {
        arr2.push(item);
        return false
    }
    return true;
});

但是,当filter()返回一个列表(在Python 3+中,它应该返回一个迭代器)时,您可能希望从结果中生成一个新的np.array(filter(lambda o: o.id == 1, x))

如果您想要访问数据密钥,则不会处理重复密钥。可以有多个具有相同filter()属性的对象。您可能想要控制键的唯一性。