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

Numpy 将对象数组转换为对象ID数组,numpy,Numpy,我有一个列表,其中有几个对象排列在3个对象的元组中 l = [(ob1, ob2, ob3), (ob1, ob3, ob4), (ob4, ob5, ob6), ...] 有了numpy,我可以把这个列表保持不变 a = np.array(l) a = a.ravel() 我几乎得到了一个带有a.tobytes() 但我仍然没有成功:\ 如何将对象数组转换为对象id数组?是什么阻止您使用id功能?另外,你在说什么东西?我这么问是因为元组实际上也是对象。 但是,假设您讨论的是obs的ID,那

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

l = [(ob1, ob2, ob3), (ob1, ob3, ob4), (ob4, ob5, ob6), ...]
有了numpy,我可以把这个列表保持不变

a = np.array(l)
a = a.ravel()
我几乎得到了一个带有
a.tobytes()

但我仍然没有成功:\


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

是什么阻止您使用
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())

是什么阻止您使用
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())

如果您不想复制数组的内容,可以将此黑客攻击用于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的检查。如果您不想复制数组的内容,您可以对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的检查。好吧,我已经通过
np.frombuffer(a.tobytes(),dtype='u8')
有效地获得了一个ID列表,但是我非常喜欢
矢量化
函数,所以我将其标记为答案:)@Mano-Wii我很乐意提供帮助!是的,事实上,我的解决方案似乎更简洁。
np.frombuffer(a.tobytes(),dtype='u8')
的作用并不明显:好吧,我已经通过
np.frombuffer(a.tobytes(),dtype='u8')
有效地获得了一个ID列表,但是我非常喜欢
矢量化
函数,所以我将它标记为答案:)@Mano Wii我很乐意提供帮助!是的,事实上,我的解决方案似乎更简洁。
np.frombuffer(a.tobytes(),dtype='u8')
的作用并不明显: