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