我有一个列表,其中有几个objedos以3个对象的元组排列......
l = [(ob1, ob2, ob3), (ob1, ob3, ob4), (ob4, ob5, ob6), ...]
有了numpy,我可以将这个列表保持平坦
a = np.array(l)
a = a.ravel()
我几乎得到了a.tobytes()
但我仍然没有取得成功:\
如何将对象数组转换为对象ID数组?
答案 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的检查