1 回答

TA貢獻(xiàn)1790條經(jīng)驗(yàn) 獲得超9個贊
當(dāng)然,只需像平常一樣索引它即可。例如,y = x[:k, :]
這將使視圖返回原始數(shù)組。不會復(fù)制任何數(shù)據(jù),對其所做的任何更新都y
將反映在其中x
,反之亦然。
編輯:
我通常使用uint8的大于10GB的3D陣列,因此我對此非常擔(dān)心...如果記住一些事項(xiàng),Numpy可以非常有效地進(jìn)行內(nèi)存管理。以下是一些避免在內(nèi)存中制作數(shù)組副本的提示:
使用+=
,-=
,*=
等,以避免使數(shù)組的一個副本。例如,x += 10
將在適當(dāng)位置修改數(shù)組,同時x = x + 10
將復(fù)制并修改它。(另外,看看numexpr)
如果您確實(shí)想使用進(jìn)行復(fù)制x = x + 10
,請注意,這x = x + 10.0
將導(dǎo)致x
將其自動轉(zhuǎn)換為浮點(diǎn)數(shù)組(如果尚未復(fù)制)。但是,x += 10.0
在哪里,x
是一個整數(shù)數(shù)組,它將導(dǎo)致10.0
向下轉(zhuǎn)換為與該數(shù)組相同精度的int。
此外,許多numpy函數(shù)都帶有一個out
參數(shù),因此您可以執(zhí)行一些操作,例如np.abs(x, x)
獲取x
就地的絕對值。
作為第二個編輯,這是關(guān)于視圖和具有numpy數(shù)組的副本的其他一些技巧:
與python列表不同,y = x[:]
它不返回副本,而是返回視圖。如果您確實(shí)想要一個副本(當(dāng)然,它將使您正在使用的內(nèi)存量增加一倍),請使用y = x.copy()
您會經(jīng)常聽到有關(guān)numpy數(shù)組的“花式索引”的信息。使用列表(或整數(shù)數(shù)組)作為索引是“花式索引”。它可能非常有用,但是可以復(fù)制數(shù)據(jù)。
例如:y = x[[0, 1, 2], :]
返回一個副本,同時y = x[:3,:]
返回一個視圖。
即使是真正瘋狂的索引,也x[4:100:5, :-10:-1, None]
都是“正?!彼饕?,盡管如此,它會返回一個視圖,所以不要害怕在大型數(shù)組上使用各種切片技巧。
x.astype(<dtype>)
將以新類型x.view(<dtype>)
返回?cái)?shù)據(jù)的副本,而將返回視圖。
但是,請務(wù)必小心……它非常強(qiáng)大且有用,但是您需要了解基礎(chǔ)數(shù)據(jù)如何存儲在內(nèi)存中。如果您有一個浮點(diǎn)數(shù)組,并將其視為int,則numpy會將數(shù)組的基礎(chǔ)位解釋為int。
例如,這意味著當(dāng)被視為64位int時,1.0
將在little-endian系統(tǒng)上作為64位浮點(diǎn)數(shù)4607182418800017408
,[ 0, 0, 0, 0, 0, 0, 240, 63]
如果被視為uint8 ,則將被視為數(shù)組。但是,當(dāng)您需要在大型陣列上進(jìn)行某種位糾纏時,這確實(shí)非常好。...您對內(nèi)存緩沖區(qū)的解釋方式具有較低級別的控制。
添加回答
舉報(bào)