2012-10-24 59 views
4

说我做一个古灵精怪的小数组:数组numpy的阵列调整

>>> a = np.array([[[1,2,3],4],[[4,5,6],5]]) 
>>> a 
array([[[1, 2, 3], 4], 
     [[4, 5, 6], 5]], dtype=object) 

再取一的第一列作为一个切片:

>>> b = a[:,0] 
>>> b 
array([[1, 2, 3], [4, 5, 6]], dtype=object) 
>>> b.shape 
(2,) 

说我现在要重塑B,使用它的形状是(2,3):

>>> b.reshape((-1,3)) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: total size of new array must be unchanged 

我假定numpy的被处理b中每个阵列作为一个对象,而不是在其本身的阵列。问题是,是否有一个很好的方法来进行所需的调整大小?

回答

3

在你的具体的例子,你可以使用numpy.vstack:

import numpy as np 


a = np.array([[[1,2,3],4],[[4,5,6],5]]) 
b = a[:,0] 

c = np.vstack(b) 
print c.shape # (2,3) 

编辑:由于您的阵列a是不是一个真正的矩阵,但阵列的集合(如指出的WIM),你可以还请执行以下操作:

b = np.array([ line for line in a[:,0]]) 
    print b.shape #(2,3) 
2

您无法在适当的位置更改b的形状,但您可以使用np.vstack(b)创建所需形状的副本。我想你可能已经知道了这一点。

请注意,如果您在检查type(a[0,0])时,您并未在第一列a中创建数组,您将看到您实际上有一个列表。即您的切片a[:,0]实际上是两个列表对象的列向量,它本身不是(也不是)数组。

+0

说得没错。但是,将数组放在[0,0]中并没有什么区别。 a [:,0]切片的结果仍返回一个对象数组。使用vstack确实可以做到这一点。 Upvote for you并接受georgesl立即指出vstack之后所需的结果形状(这正是我所寻找的)。 –