繁体   English   中英

NumPy 就地重塑阵列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM