簡體   English   中英

將列表列轉換為二維 numpy 數組

[英]Convert column of lists to 2D numpy array

我正在對 Pandas 數據框進行一些操作。 對於某個列,我需要將每個單元格轉換為一個不難的 numpy 數組。 最終目標是從整個列中獲得一個二維數組。 但是,當我執行以下操作時,我得到了一個一維數組,並且無法識別內部數組。

df = pd.DataFrame({'col': ['abc', 'def']})
mapping = {v: k for k, v in enumerate('abcdef')}
df['new'] = df['col'].apply(lambda x: list(x))
df['new'].apply(lambda x: np.array([mapping[i] for i in x])).values

這給出:

array([array([0, 1, 2]), array([3, 4, 5])], dtype=object)

形狀為 (2,),表示無法識別內部數組。

如果我做s.reshape(2,-1) ,我得到(2,1)而不是(2,3)的形狀。

感謝任何幫助!


澄清:

以上只是一個玩具示例。 我正在做的是使用 IMDB 數據集對機器學習進行預處理。 我必須將評論列中的每個值轉換為一個詞嵌入,它是一個 numpy 數組。 現在的挑戰是將所有這些數組作為 2D 數組導出,以便我可以在我的機器學習模型中使用它們。

我認為直接從列表值創建一個數組會更好。

 df
   col        new
0  abc  [a, b, c]
1  def  [d, e, f]

arr = np.array(df['new'].tolist())
arr
# array([['a', 'b', 'c'],
#        ['d', 'e', 'f']], dtype='<U1')

arr.shape
# (2, 3)

大免責聲明:只有當子列表都具有相同數量的元素時,這才有效。 如果不是,則意味着它們是參差不齊的數組,並且 numpy 將無法使用有效的內存格式來表示您的數組(因此, dtype='object' )。

In [2]: import pandas as pd
In [3]: df = pd.DataFrame({'col': ['abc', 'def']})
   ...: mapping = {v: k for k, v in enumerate('abcdef')}
   ...: df['new'] = df['col'].apply(lambda x: list(x))

In [7]: df['new']
Out[7]: 
0    [a, b, c]
1    [d, e, f]
Name: new, dtype: object
In [8]: df['new'].values
Out[8]: array([list(['a', 'b', 'c']), list(['d', 'e', 'f'])], dtype=object)

np.stack行為很像np.array ,在新的初始軸上加入元素:

In [9]: np.stack(df['new'].values)
Out[9]: 
array([['a', 'b', 'c'],
       ['d', 'e', 'f']], dtype='<U1')

或在您選擇的另一個軸上:

In [10]: np.stack(df['new'].values, axis=1)
Out[10]: 
array([['a', 'd'],
       ['b', 'e'],
       ['c', 'f']], dtype='<U1')

如果對象數組變成一個列表, np.array也可以工作(如@coldspeed 所示):

In [11]: df['new'].values.tolist()
Out[11]: [['a', 'b', 'c'], ['d', 'e', 'f']]
In [12]: np.array(df['new'].values.tolist())
Out[12]: 
array([['a', 'b', 'c'],
       ['d', 'e', 'f']], dtype='<U1')

至於速度,讓我們制作一個更大的數組:

In [16]: arr = np.frompyfunc(lambda x: np.arange(1000),1,1)(np.arange(1000))
In [17]: arr.shape
Out[17]: (1000,)
In [18]: np.stack(arr).shape
Out[18]: (1000, 1000)
In [20]: np.array(arr.tolist()).shape
Out[20]: (1000, 1000)

In [21]: timeit np.stack(arr).shape
5.24 ms ± 190 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [22]: timeit np.array(arr.tolist()).shape
4.45 ms ± 138 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

基本相同,與np.array方法略有np.array

stackvstack根據需要擴大各元件的尺寸。 concatenate跳過它會快一點:

In [27]: timeit np.concatenate(arr).reshape(-1,1000).shape
4.04 ms ± 12.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

這個arr包含數組。 如果它包含列表而不是array(arr.tolist())方法會更好(相對),因為它只有一個列表(列表)要轉換為數組。 stack方法必須首先將每個子列表轉換為數組。

暫無
暫無

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

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