如何将数组数组转换为单个高维数组?

时间:2017-09-05 22:41:17

标签: python arrays numpy

我有一个Python脚本,不知怎的,在我的Numpy计算中,我得到了一个这样的变量:

In [72]: a
Out[72]: 
array([[ array([-0.02134025+0.1445159j , -0.02136137+0.14458584j,
       -0.02138250+0.14465578j, ..., -0.01568173+0.12424096j,
       -0.01569507+0.12429295j, -0.01570842+0.12434494j]),
        array([-0.14451590+0.97865975j, -0.14458584+0.97863863j,
       -0.14465578+0.9786175j , ..., -0.12424096+0.98431827j,
       -0.12429295+0.98430493j, -0.12434494+0.98429158j])],
       [ array([-0.14451590+0.97865975j, -0.14458584+0.97863863j,
       -0.14465578+0.9786175j , ..., -0.12424096+0.98431827j,
       -0.12429295+0.98430493j, -0.12434494+0.98429158j]),
        array([ 0.02134025-0.1445159j ,  0.02136137-0.14458584j,
        0.02138250-0.14465578j, ...,  0.01568173-0.12424096j,
        0.01569507-0.12429295j,  0.01570842-0.12434494j])]], dtype=object)

In [73]: np.shape(a)
Out[73]: (2, 2)

所以它基本上是一个二维数组,其中每个元素都是一个长度为n的数组,但不知何故a不是形状(2,2,n)的3D数组。您可以在打印输出中的每个元素中看到额外的单词array。我不明白这是怎么发生的,但是我想将a变成一个形状为(2,2,n)的3D数组,因为我有其他(2,2,n)个变量,而且它们是'不可互操作。 (如果我可以将其他(2,2,n)数组转换为与a相同的可能也可能有效的数据,我猜。)

例如,像这样的形状(2,2,3)的数组不会在每个元素中打印出额外的array字词。形状为(2,2,3)而非(2,2)

In [75]: np.zeros((2,2,3))
Out[75]: 
array([[[ 0.,  0.,  0.],
        [ 0.,  0.,  0.]],

       [[ 0.,  0.,  0.],
        [ 0.,  0.,  0.]]])

我尝试了np.asarray(a)a.reshape((2,2,)),但他们没有做任何事情,我猜它已经是一个阵列了。

更新:这是生成类似a的类似代码:

In [80]: T1 = np.array([ [np.linspace(0,1,5),0],[0,1] ])

In [81]: T1
Out[81]: 
array([[array([ 0.  ,  0.25,  0.5 ,  0.75,  1.  ]), 0],
       [0, 1]], dtype=object)

In [82]: T2 = np.identity(2)

In [83]: T2
Out[83]: 
array([[ 1.,  0.],
       [ 0.,  1.]])

In [84]: T3 = np.dot(T1,T2)

In [85]: T3
Out[85]: 
array([[array([ 0.  ,  0.25,  0.5 ,  0.75,  1.  ]),
        array([ 0.,  0.,  0.,  0.,  0.])],
       [0.0, 1.0]], dtype=object)

In [86]: T4 = np.dot(T2,T3)

In [87]: T4
Out[87]: 
array([[array([ 0.  ,  0.25,  0.5 ,  0.75,  1.  ]),
        array([ 0.,  0.,  0.,  0.,  0.])],
       [array([ 0.,  0.,  0.,  0.,  0.]), array([ 1.,  1.,  1.,  1.,  1.])]], dtype=object)

元素长度相同,asarray无效。

In [88]: np.asarray(T4)
Out[88]: 
array([[array([ 0.  ,  0.25,  0.5 ,  0.75,  1.  ]),
        array([ 0.,  0.,  0.,  0.,  0.])],
       [array([ 0.,  0.,  0.,  0.,  0.]), array([ 1.,  1.,  1.,  1.,  1.])]], dtype=object)

2 个答案:

答案 0 :(得分:0)

此行为是由您使用的complex数据类型引起的。如果仔细查看数组,可以发现内部数组的dtypeobject而不是complex。请在计算/创建期间通过正确设置内部数组的dtype来检查是否已解决此问题。

如果这没有帮助,请检查this SO线程。这是一个类似的问题,可能会为您提供一个简单的解决方案。

答案 1 :(得分:0)

如上所述,

a是一个2d数组,其中每个元素都是1d数组。

np.array(...)尝试创建尽可能高的维数组。但是,如果子元素(或列表)的大小不同,它就可以生成对象数组(或者在某些情况下会引发错误)。你的T1就是这种阵列。

如果您的子阵列形状相同,我们可以将其转换为3d数组。

我无法使用copynpaste重新创建T4,因为np.array制作了一个3d数组:

In [35]: array = np.array
In [36]: T4= array([[array([ 0.  ,  0.25,  0.5 ,  0.75,  1.  ]),
    ...:         array([ 0.,  0.,  0.,  0.,  0.])],
    ...:        [array([ 0.,  0.,  0.,  0.,  0.]), array([ 1.,  1.,  1.,  1.,  1
    ...: .])]], dtype=object)
    ...:        
In [37]: T4
Out[37]: 
array([[[0.0, 0.25, 0.5, 0.75, 1.0],
        [0.0, 0.0, 0.0, 0.0, 0.0]],

       [[0.0, 0.0, 0.0, 0.0, 0.0],
        [1.0, 1.0, 1.0, 1.0, 1.0]]], dtype=object)

但是使用dot序列:

In [41]: T1 = np.array([ [np.linspace(0,1,5),0],[0,1] ])
In [42]:  T2 = np.identity(2)
In [43]: T3 = np.dot(T1,T2)
In [44]: T4 = np.dot(T2,T3)

但我可以将其转换为concatenate的一个数组。实际上stack在这里最好。但首先我必须把它变成一个1d数组(4,)。 np.vstack也可以。实际上它现在是4个5元素阵列的列表:

In [47]: np.stack(T4.ravel())
Out[47]: 
array([[ 0.  ,  0.25,  0.5 ,  0.75,  1.  ],
       [ 0.  ,  0.  ,  0.  ,  0.  ,  0.  ],
       [ 0.  ,  0.  ,  0.  ,  0.  ,  0.  ],
       [ 1.  ,  1.  ,  1.  ,  1.  ,  1.  ]])
In [48]: _.reshape(2,2,-1)
Out[48]: 
array([[[ 0.  ,  0.25,  0.5 ,  0.75,  1.  ],
        [ 0.  ,  0.  ,  0.  ,  0.  ,  0.  ]],

       [[ 0.  ,  0.  ,  0.  ,  0.  ,  0.  ],
        [ 1.  ,  1.  ,  1.  ,  1.  ,  1.  ]]])

通常我通过制作一个空白对象数组来重新创建像T4这样的数组,例如a = np.zeros((2,2),object),然后从列表中填充插槽。但是海报也是从第三方包中获得的。所以这个stack技巧很有用。