簡體   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