【问题标题】:When is the size of an ndarray not fixed?ndarray 的大小何时不固定?
【发布时间】:2019-05-05 23:51:05
【问题描述】:

numpy.ndarray documentation 声明:

ndarray 是一个(通常是固定大小的)多维容器,包含相同类型和大小的项目。

我对这里的形容词通常感到惊讶。我认为 ndarray 始终是固定大小的。什么时候ndarray的大小不固定?

【问题讨论】:

    标签: python numpy multidimensional-array numpy-ndarray


    【解决方案1】:

    您可以重新塑造尺寸,因此内存本身是固定大小的,但您塑造它的方式可能会被调整(因此它可能不是固定尺寸)。

    您可以使用resize 调整数组的大小,但它基本上是一个新数组。

    【讨论】:

    • 这会改变形状(x.shape),但不会改变大小(x.sizex.nbytes)——除非我可以改变 dtype?啊,确实我可以改变dtype。 x = arange(10, dtype="u2"); x.dtype = "u1" 实际上确实改变了x.size(但不是x.nbytes)。您可以在答案中添加更改 dtype(我从未在实时代码中这样做过,尽管我创建了与不同 dtype 对应的视图)。
    • 你也可以做类似的奇怪的事情,虽然可能不推荐!
    【解决方案2】:

    您可以使用 ndarray.resize 更改 ndarray 的大小。 我没有广泛使用它,所以我无法谈论优点或缺点。 但是,看起来很简单

    >>> a = ones(3)
    
    >>> a.resize(1)
    
    >>> a
    array([ 1.])
    

    但是,它似乎经常引发错误

    >>> a.resize(3)
    ---------------------------------------------------------------------------
    ValueError                                Traceback (most recent call last)
    <ipython-input-34-bc3af9ce5259> in <module>()
    ----> 1 a.resize(3)
    
    ValueError: cannot resize an array that references or is referenced
    by another array in this way.  Use the resize function
    

    这些可以通过传入refcheck=False 来抑制。 这告诉 numpy 你知道你在做什么,它不需要检查没有其他对象正在使用相同的内存。当然,如果不是这种情况,这可能会导致问题。

    >>> a.resize(3, refcheck=False)
    
    >>> a
    array([ 1.,  0.,  0.])
    
    >>> a.resize((2, 2), refcheck=False)
    
    >>> a
    Out[39]: 
    array([[ 1.,  0.],
           [ 0.,  0.]])
    

    【讨论】:

      猜你喜欢
      • 2012-03-17
      • 2021-06-07
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      相关资源
      最近更新 更多