2015-12-21 18 views
3

我在我的工具箱中具有以下功能并且严重依赖它。我觉得很难相信这样做不会有一个颠簸的内建,但是我在numpy中搜索可能的函数名称,以及谷歌搜索这个问题的各种解释,并没有发现任何东西。有什么吗?确保numpy数组中至少具有某种维度

def project(a, maxdim): 
    """ 
    Return a view of the numpy array <a> that has at least <maxdim>+1 
    dimensions (pad a.shape with 1's on the right if necessary). 
    """ 
    if isinstance(a, numpy.matrix) and maxdim > 1: a = numpy.asarray(a) 
    else: a = a.view() 
    a.shape += (1,) * (maxdim-len(a.shape)+1) 
    return a 
+0

我没有看到你的if语句点;对numpy.asarray的调用将完成同样的事情。这留下了一个相当简单的单线,不,我不认为它比这更简单。 –

+0

@EelcoHoogendoorn两行:一个创建副本,一个扩展状态。任何超过1行的值都是值得的。 – jez

+0

np.asarray(a).reshape(*(shape +(1,)*(maxdim + 1-a.ndim))) 可以说,尽管如此,仍然值得做一个函数。 –

回答

3

具有默认Fortran订单的MATLAB自动在右侧添加尺寸。 numpy是默认的C顺序,并且倾向于将它们附加在左侧。

np.array需要一个ndmin参数,该参数根据需要预先设置1。

例如

In [89]: np.array([1,2,3],ndmin=4).shape 
Out[89]: (1, 1, 1, 3) 

有3 np.atleast_?d功能。

In [92]: np.atleast_2d([1,2,3]).shape 
Out[92]: (1, 3) 
In [93]: np.atleast_3d([1,2,3]).shape 
Out[93]: (1, 3, 1) 

atleast_3dnp.dstack使用,并可能已被明确书面使用。

广播时,numpy将根据需要预先添加维度;张贴等待他们需要明确的行动你的一部分。这只是开发者选择的默认numpy

np.ones((3,4,5))+np.zeros((5)) 

np.array需要copy参数以及

In [113]: x=np.array([1,2,3]) 
In [114]: y=np.array(x, ndmin=3,copy=False) 

In [117]: y.__array_interface__['data'] 
Out[117]: (152332976, False) 
In [118]: x.__array_interface__['data'] 
Out[118]: (152332976, False) 
+0

很高兴知道!除了(1)它会很好追加,而不是前置,(2)它需要分配一个新的数组。 “asarray”和“view”都不支持'ndmin'。 – jez

+1

你可以在'np.array'中使用'copy = False'。 – hpaulj

相关问题