当ndarray的大小不固定时是什么情况?

3
numpy.ndarray文档指出:

ndarray是一种(通常为固定大小的)相同类型和大小的多维容器。

我对这里的形容词“通常”感到惊讶。我认为ndarray总是固定大小的。那么什么情况下ndarray的大小不是固定的?
2个回答

2

您可以重新定义数组的维度,因此内存本身是固定大小的,但您可以调整其形状(因此可能不是固定尺寸)。

您可以使用resize重新调整数组的大小,但实际上这相当于创建了一个新的数组。


这会改变形状(x.shape),但不会改变大小(x.sizex.nbytes)——除非我可以改变dtype?啊,确实我可以改变dtype。x = arange(10, dtype="u2"); x.dtype = "u1" 实际上确实改变了 x.size(但不是 x.nbytes)。您可以将更改 dtype 添加到答案中(我从未在实时代码中执行过此操作,尽管我已创建对应于不同 dtypes 的视图)。 - gerrit
你也可以做一些奇怪的事情,尽管可能不被推荐! - Matthieu Brucher

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.]])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接