簡體   English   中英

從包含在列表對象中的 numpy 數組切片創建數組

[英]Create array from slices of numpy arrays contained in a list object

我有一個形狀為(7761940, 16)的熊貓數據(7761940, 16) 我使用np.array_split將其轉換為 7762 個 numpy 數組的列表,每個數組的形狀為(1000, 16)

現在我需要從每個數組中取出前 50 個元素的一部分,並從中創建一個形狀為(388100, 16)的新數組。 數字 388100 來自 7762 個數組乘以 50 個元素。

我知道這是一種切片和索引,但我無法管理它。

在從朋友的評論和一些調查中受益后,我想出了一個解決方案:

my_data = np.array_split(dataframe, 7762) #split dataframe to a list of 7762 ndarray
                                          #each of 1000x16 dimension   
my_list = []                          #define new list object
for i in range(0,7762):               #loop to iterate over the 7762 ndarrays
  my_list.append(my_data[i][0:50, :]) #append first 50 rows from each adarray into my_list

如果拆分數組,則會浪費內存。 如果您填充數組以進行良好的重塑,則會浪費內存。 這不是一個大問題,但可以避免。 一種方法是使用神秘的np.lib.stride_tricks.as_strided函數。 這個函數很危險,我們會用它打破一些規則,但只要你只想要一個塊的前 50 個元素,並且最后一個塊超過 50 個元素,一切都會好起來的:

x = ... # your data as a numpy array
chunks = int(np.ceil(x.shape[0] / 1000))
view = np.lib.stride_tricks.as_strided(x, shape=(chunks, 1000, x.shape[-1]), strides=(np.max(*x.strides) * 1000, *x.strides))

這將在原始內存中創建形狀(7762, 1000, 16)的視圖,而無需復制。 由於您的原始數組沒有 1000 行的倍數,因此最后一個平面將有一些不屬於您的內存。 只要您不嘗試訪問它,它就不會傷害您。

現在訪問每個平面的前 50 個元素是微不足道的:

data = view[:, :50, :]

您可以解開第一個維度以獲得最終結果:

data.reshape(-1, x.shape[-1])

一個更健康的方法是填充和重塑原始。

你可以這樣做:

  1. 將大小為 (7762000 x 16) 的數據拆分為 (7762 x 1000 x 16)

     data_first_split = np.array_split(data, 7762)
  2. 將數據切片為 7762 x 50 x 16,得到data_first_split的前 50 個元素

    data_second_split = data_first_split[:, :50, :]
  3. 重塑以獲得 388100 x 16

     data_final = np.reshape(data_second_split, (7762 * 50, 16))

正如@hpaulj 提到的,您也可以使用 np.vstack 來完成。 IMO 你也應該看看numpy.strides

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM