我有一个包含对象列表的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类型的名称。此外,我不认为结构化数组可以是对象列表。
答案 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()
属性的对象。您可能想要控制键的唯一性。