[英]NumPy reshape array in-place
我需要就地调整 NumPy 数组的大小,所以我更喜欢numpy.resize()
模块而numpy.reshape()
。 我发现如果我在所需形状的维度之一中指定 -1,则numpy.resize()
会返回维度错误的数组。 有谁知道为什么会这样? 就地调整数组大小的另一种方法是什么?
使用ndarray.resize
获得的就地调整大小不允许负尺寸。 您可以轻松检查自己:
a=np.array([[0,1],[2,3]])
a.resize((4,-1))
> ValueError: negative dimensions not allowed
在大多数情况下, np.reshape
将返回数组的 视图,因此不会有不必要的复制和额外的 memory 分配(尽管它不会就地修改数组):
a_view = a.reshape(4,-1)
np.shares_memory(a, a_view)
# True
但即使reshape
不允许就地操作,您可以做的是将新形状分配给 array 的 shape 属性,它允许负尺寸:
a.shape = (4,-1)
这是一个就地操作,并且与a.resize((4,1))
一样高效。 请注意,如果不复制数据就无法完成重塑,此方法将引发错误。
以下是与更大数组进行效率比较的一些时序,包括从视图重新分配的时序:
def inplace_reshape(a):
a.shape = (10000,-1)
def inplace_resize(a):
a.resize((10000,3))
def reshaped_view(a):
a = np.reshape(a, (10000,-1))
def resized_copy(a):
a = np.resize(a, (10000,3))
a = np.random.random((30000,1))
%timeit inplace_reshape(a)
# 383 ns ± 14.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit inplace_resize(a)
# 294 ns ± 20.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit reshaped_view(a)
# 1.5 µs ± 25.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit resized_copy(a)
# 21.5 µs ± 289 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
如果它们都产生相同的结果:
b = np.copy(a)
a.shape = (10000,-1)
b.resize((10000,3))
np.array_equal(a,b)
# True
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.