如何从数组创建一个1元素数组的数组?

时间:2015-05-27 01:09:13

标签: python arrays numpy

我希望能够转换数组,例如

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

进入相同的数组但是每个元素作为1元素数组而不是数字。 所需的输出是:

np.array([[np.array([1]), np.array([2])], [np.array([3]), np.array([4])]]) 

3 个答案:

答案 0 :(得分:0)

np.array([ [ [x] for x in row ] for row in [[1,2], [3,4]] ])

答案 1 :(得分:0)

您描述的操作很少有用。更有可能的是,最好在数组的末尾添加一个长度为1的额外维度:

a = a[..., np.newaxis]
# or
a = a.reshape(a.shape + (1,))

然后a[0, 1]将成为一维数组,但广播和ufuncs等所有不错的NumPy功能都能正常工作。请注意,这会创建原始数组的视图;如果您需要独立副本,可以调用copy()方法。

如果你真的想要一个二维数组,其元素是一维数组,那么NumPy并不能让你轻松搞定。 (它几乎从来都不是组织数据的好方法,因此NumPy开发人员提供一种简单的方法来做这件事没有多大理由。)你可能希望创建这样的大多数事情。数组将改为创建一个3D数组。我知道的最直接的方法是创建一个空的对象dtype数组,并使用普通的Python循环逐个填充单元格:

b = numpy.empty(a.shape, dtype=object)
for i in range(a.shape[0]):
    for j in range(a.shape[1]):
        b[i, j] = numpy.array([a[i, j]])

答案 2 :(得分:0)

你正在努力np.array尝试创建高维数组。

例如,您输入的所需表达式会生成一个(2,2,1)数组:

a2 = np.array([[np.array([1]), np.array([2])], [np.array([3]), np.array([4])]])

In [172]: a2
Out[172]: 
array([[[1],
        [2]],

       [[3],
        [4]]])

这可能实际上是你想要的(尽管有印刷品外观),因为

In [180]: a2[0,0]
Out[180]: array([1])

通常最好的方法来对抗numpy制作更高级数组的趋势,就是使用右shapedtype将其初始化为空,然后填充它:

In [183]: a1=np.empty(a.shape,dtype=object)    
In [184]: a1.flat=[np.array(x) for x in a.flatten()]
In [185]: a1
Out[185]: 
array([[array(1), array(2)],
       [array(3), array(4)]], dtype=object)

它具有正确的形状(2,2)和dtype。元素是数组 - 但它们的尺寸是错误的',()而不是(1,)flatflatten是用于迭代nd数组的便捷工具,就好像它们是1d一样。

a1.flat=[np.array([x]) for x in a.flatten()]不起作用 - 它是ints的数组,如a,但对象为dtype。

更明确的迭代确实有效:

In [214]: a1=np.empty(a.shape,dtype=object)
In [215]: for i in np.ndindex(2,2):
    a1[i]=np.array([a[i]])
In [216]: a1
Out[216]: 
array([[array([1]), array([2])],
       [array([3]), array([4])]], dtype=object)