首页 > 解决方案 > 通过 np.concatenate python 连接值

问题描述

任何让我开始的帮助表示赞赏。我有一个大数据框,这是一个小例子,我试图在数据框中连接数组,但对于大数据(许多行和列)来说非常慢。

这是代码。

import numpy as np
import pandas as pd
# Define a dictionary containing students data 
data = {#'Name': ['Ankit', 'Amit'], 
                'Val': [np.zeros(2)],
                'Val1':[np.ones(2)],
                'Val2':[np.ones(2)]
} 
  
# Convert the dictionary into DataFrame 
df = pd.DataFrame(data, columns = ['Val','Val1','Val2']) 

for index, row in df.iterrows(): 
    prev = np.zeros((1,1,2))
    for r in row:
        prev = np.concatenate((prev, [[r.tolist()]]))
X=np.delete(prev, 0,axis=0).reshape(df.shape[0],df.shape[1],2)

我已经搜索过,一些帖子建议使用 pandas 应用,但我不知道该怎么做。只是想知道是否有人可以分享一个更好的方法来做到这一点,以便我可以开始。谢谢你。

编辑:根据@StupidWolf 的建议更新了答案。谢谢!

def format(df):
    result = []
    for idx in df.index:
        print(idx)
        X=np.vstack(df.to_numpy()[idx])
        print(X)
        result.append(X)
    return result

    result = format(df)
    nsamples, nx, ny = result.shape
    print(nsamples,nx,ny)

当我打印 X 时,我得到了预期的输出和形状,但是当我将它添加到列表中时,我看不到形状。形状对我来说很重要,因为我需要改变尺寸。谢谢你。

标签: pythonpandasnumpy

解决方案


如果目标是为每个行条目堆叠列,您可以这样做:

df = pd.DataFrame({'Val0':[np.random.randint(0,5,2) for i in range(3)],
'Val1':[np.random.randint(0,5,2) for i in range(3)],
'Val2':[np.random.randint(0,5,2) for i in range(3)]})

数据框如下所示:

     Val0    Val1    Val2
0  [2, 1]  [0, 1]  [1, 0]
1  [0, 3]  [0, 0]  [3, 4]
2  [2, 2]  [3, 3]  [2, 0]

您可以像这样堆叠非常行:

[np.vstack(i) for i in df.to_numpy()]

要查看形状,您需要将此列表设为 np.array:

res = np.array([np.vstack(i) for i in df.to_numpy()])
res.shape
(3, 3, 2)

给你一个列表,你的行的长度:

[array([[2, 1],
        [0, 1],
        [1, 0]]),
 array([[0, 3],
        [0, 0],
        [3, 4]]),
 array([[2, 2],
        [3, 3],
        [2, 0]])]

或者,如果您熟悉 pandas:

res = df.apply(lambda i:np.vstack(i),axis=1)

它被组织成一个系列,非常元素具有您需要的形状:

res[0]
 
array([[2, 1],
       [0, 1],
       [1, 0]])

res[1]
 
array([[0, 3],
       [0, 0],
       [3, 4]])

推荐阅读