2011-11-19 3 views
3

큰 행렬 (배열) 구조 (3 축)를 만들고 각 요소는 Python 객체 (myclass 인스턴스)에 대한 참조를 저장해야합니다. 그러한 배열을 만들기 위해 numpy를 사용할 수 있습니까? 파이썬 참조를 저장하기 위해 사용해야하는 데이터 유형은 무엇입니까? numpy의 장점은 여러 수준에서 슬라이스를 지원한다는 것입니다. 대안으로 중첩 된 (중첩 된) 목록을 만드는 것이지만 그것은 번거로운 솔루션입니다.NumPy 및 객체 참조가있는 Python 3

답변

2

dtype=object을 사용하여 Python 개체를 배열에 저장하십시오.

import numpy as np 

class Foo: pass 

arr=np.empty(2,dtype=object) 
arr[:]=[Foo(),Foo()] 
print(arr) 
# [<__main__.Foo instance at 0xb7827d0c> 
# <__main__.Foo instance at 0xb748b5ac>] 

print(arr.dtype) 
# object 
+3

호기심이 있다면 NumPy가 dtype'object'의 배열에있는 객체에 포인터를 저장한다는 것을 검사 할 수 있습니다 :'x = object(); a = np.array ([x, x]); print (id (x), id (x)) == struct.unpack ('2L', ctypes.string_at (a.ctypes.data, 8))'(32 비트 파이썬). – eryksun

+0

@eryksun :'ctypes.string_at (a.ctypes.data, 8)'을 더 간단하고보다 일반적인'a.tostring()'으로 간단하게 대체 할 수 있습니다. – EOL

+0

@eryksun : + 귀하의 의견을 : 'ctypes.string_at()'실제로 흥미로운 기능입니다. :) – EOL

1

object을 dtype으로 지정하면 원하는 것을 저장할 수 있습니다. 당신이 myclass 대신 object 사용할 수 있도록

import numpy 

print numpy.array([['a', (2, 2)], [1, 2+3j], [open, xrange(7)]], dtype=object) 

어떤 알 수없는 유형은 이런 식으로 작동합니다. object은 numpy 최적화없이 임의의 객체를 저장한다는 것을 분명히합니다. 자세한 내용은 the docs을 참조하십시오.

1

당신은 특별한 아무것도 할 필요가 없습니다 :이 상자 밖으로 작동합니다

>>> import numpy 
>>> class TheClass(object): 
...  pass 
... 
>>> numpy.array([TheClass(), TheClass()]) 

array([<__main__.TheClass object at 0x10d435a50>, 
     <__main__.TheClass object at 0x10d435a90>], dtype=object) 

NumPy와가 자동으로 감지 배열 객체 등 표준 스칼라 유형 (플로트, INT, 하나의 아니라는 것을 .) 자동으로 dtypeobject으로 설정하여 처리합니다.