2010-07-17 110 views
5

我想创建一个数组dtype=np.object,其中每个元素是一个数字类型的数组,例如int或float。例如:Numpy对象数组数组

>>> a = np.array([1,2,3]) 
>>> b = np.empty(3,dtype=np.object) 
>>> b[0] = a 
>>> b[1] = a 
>>> b[2] = a 

创建什么,我想:

>>> print b.dtype 
object 

>>> print b.shape 
(3,) 

>>> print b[0].dtype 
int64 

但我想知道是否有不写3行6在同一行(尤其是因为我可能会想连接的方式100个阵列)。我试图

>>> b = np.array([a,a,a],dtype=np.object) 

但其实这转换的所有元素np.object:

>>> print b.dtype 
object 

>>> print b.shape 
(3,) 

>>> print b[0].dtype 
object 

没有人有任何想法如何避免这种情况?

回答

3

这不完全漂亮,但...

import numpy as np 

a = np.array([1,2,3]) 
b = np.array([None, a, a, a])[1:] 

print b.dtype, b[0].dtype, b[1].dtype 
# object int32 int32 
+0

这很好,简洁:-) – astrofrog 2012-03-24 10:44:38

-1

我觉得anyarray的是什么您这里需要:

b = np.asanyarray([a,a,a]) 
>>> b[0].dtype 
dtype('int32') 

不知道发生了什么事的整数的其他32位虽然。

不知道是否有帮助,但如果添加了不同形状的另一个阵列,将其转换回你想要的类型:

import numpy as np 
a = np.array([1,2,3]) 
b = np.array([1,2,3,4]) 
b = np.asarray([a,b,a], dtype=np.object) 
print(b.dtype) 
>>> object 
print(b[0].dtype) 
>>> int32 
+0

这必须是我的Python运行在32位。 – SiggyF 2010-07-17 20:10:14

+2

这似乎并不奏效,因为b.dtype的类型是np.int64,而不是np.object。 – astrofrog 2010-07-17 20:28:47

0

我无法找到任何优雅的解决方案,但至少更用手做的一切通用的解决方案是申报表格的函数:

def object_array(*args): 
    array = np.empty(len(args), dtype=np.object) 
    for i in range(len(args)): 
     array[i] = args[i] 
    return array 

那么我可以这样做:

a = np.array([1,2,3]) 
b = object_array(a,a,a) 

然后我得到:

>>> a = np.array([1,2,3]) 
>>> b = object_array(a,a,a) 
>>> print b.dtype 
object 
>>> print b.shape 
(3,) 
>>> print b[0].dtype 
int64 
2
a = np.array([1,2,3]) 
b = np.empty(3, dtype='O') 
b[:] = [a] * 3 

应该足够了。