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个元素
我知道这是一种切片和索引,但我无法管理它。您可以这样做:
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])