Python 从列表对象中包含的numpy数组切片创建数组

Python 从列表对象中包含的numpy数组切片创建数组,python,arrays,list,numpy,split,Python,Arrays,List,Numpy,Split,我有一个熊猫数据框的形状(7761940,16)。我使用np.array\u split将其转换为7762个numpy数组的列表,每个数组的形状(1000,16) 现在我需要从每个数组中取出前50个元素的一部分,并从中创建一个新的shape数组(388100,16)。数字388100来自7762个数组乘以50个元素 我知道这是一种切片和索引,但我无法管理它。您可以这样做: 将大小为(7762000 x 16)的数据拆分为(7762 x 1000 x 16) 将数据切片至7762 x 50 x

我有一个熊猫数据框的形状
(7761940,16)
。我使用
np.array\u split
将其转换为7762个numpy数组的列表,每个数组的形状
(1000,16)

现在我需要从每个数组中取出前50个元素的一部分,并从中创建一个新的shape数组
(388100,16)
。数字388100来自7762个数组乘以50个元素


我知道这是一种切片和索引,但我无法管理它。

您可以这样做:

  • 将大小为(7762000 x 16)的数据拆分为(7762 x 1000 x 16)

  • 将数据切片至7762 x 50 x 16,以获得数据的前50个元素

  • 重塑以获得388100 x 16

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

  • 正如@hpaulj所提到的,您也可以使用np.vstack来完成。我想你也应该看看。

    在从朋友的评论和一些调查中获益后,我想出了一个解决方案:

    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
    

    如果拆分阵列,则会浪费内存。如果对阵列进行填充以实现良好的重塑,则会浪费内存。这不是一个大问题,但可以避免。一种方法是使用奥术函数。这个函数很危险,我们可能会违反一些规则,但只要您只需要块的前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))
    
    这将在原始内存中创建形状视图
    (77621000,16)
    ,而无需复制。由于原始数组没有1000行的倍数,最后一个平面将有一些不属于您的内存。只要你不尝试访问它,它就不会伤害你

    现在,访问每个平面的前50个元素非常简单:

    data = view[:, :50, :]
    
    可以分解第一个维度以获得最终结果:

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

    一种更为健康的方法是填充并重塑原始内容。

    列表理解:
    np.vstack([arr[:50,:]表示拆分列表中的arr])
    应该可以工作。或者,将原始数组重塑为(77621000,16),并使用
    [:,:50,:]
    将切片重塑为二维,使用(-1,16)。并非所有数组都有1000行。你可能更喜欢填充。谢谢Rick M.的回复,但这是我在应用秒分割时得到的结果:在-->1 data\u second\u split=data\u first\u split[:,:50,:]类型错误:列表索引必须是整数或切片,而不是执行np.array(np.array\u split(data,7762))的元组。如果要在分割后立即重新组装,不要拆分。拆分不会返回数组。您可以直接迭代
    my_data
    ,因此将最后三行缩减为一个列表。这不会为您创建阵列,而且效率也不是很高。我非常感谢您的回复,节省内存在这个过程中有着至关重要的影响。非常感谢“疯狂物理学家”萨阿德。你应该测试我的答案,因为我写的时候没有桌面。如果可行,请随意选择。
    data = view[:, :50, :]
    
    data.reshape(-1, x.shape[-1])