将对象数组转换为对象ID数组

时间:2017-08-28 12:39:49

标签: numpy

我有一个列表,其中有几个objedos以3个对象的元组排列......

l = [(ob1, ob2, ob3), (ob1, ob3, ob4), (ob4, ob5, ob6), ...]

有了numpy,我可以将这个列表保持平坦

a = np.array(l)
a = a.ravel()

我几乎得到了a.tobytes()

的一系列ID

但我仍然没有取得成功:\

如何将对象数组转换为对象ID数组?

2 个答案:

答案 0 :(得分:0)

什么阻止您使用id功能?此外,你在谈论什么对象?我问,因为元组实际上也是对象。 但是,假设你在讨论关于obs的id,你可以去:

object_ids = map(id, np.asarray(l).flatten())

修改

哦,实际上如果你想要一个对象id数组,那么也许你应该这样:

get_ids = np.vectorize(lambda obj: id(obj))
array_of_obj_ids = get_ids(np.asarray(list_of_objects).flatten())

答案 1 :(得分:0)

如果您不想复制数组的内容,可以将此hack用于ctypes:

import ctypes
import numpy as np

def switch_funcs(func1, func2):    
    from types import FunctionType
    assert isinstance(func1, FunctionType)
    assert isinstance(func2, FunctionType)

    size = FunctionType.__basicsize__

    func1_ptr = (ctypes.c_char * size).from_address(id(func1))
    func2_ptr = (ctypes.c_char * size).from_address(id(func2))

    store = (ctypes.c_char * size)(*func1_ptr)
    func1_ptr[:] = func2_ptr[:]
    func2_ptr[:] = store[:]


def dummy(*args, **vargs):
    pass

a = np.array([(ob1, ob2, ob3), (ob1, ob3, ob4), (ob4, ob5, ob6)])

switch_funcs(dummy, np.core._internal._view_is_safe)
b = a.view(dtype = 'u8')
switch_funcs(dummy, np.core._internal._view_is_safe)

print(b)

它会暂时删除阻止从dtype对象更改为uint64的检查