首页 > 解决方案 > 创建一个 numpy 数组,其中包含 .npz 输入文件的数组列表

问题描述

我正在分析属于 5 个不同年龄组的 5 个不同成员的食品支出。我想创建一个 .npz 格式的文件,它应该有两个变量,即“年龄”和“人”。我正在尝试获取一个包含数组列表的数组。

我创建了一个包含 5 个成员“人”的列表和一个包含 5 个相应年龄组的列表作为“年龄”。但是,在访问创建的 .npz 文件后,我得到了一个大小为 (5,7) 的组合数组。

person1 = np.array([(1, 2, 3, 4),
                    (4, 5, 6, 5),
                    (7, 8, 9, 6),
                    (9, 6, 5, 4),
                    (6, 5, 4, 3),
                    (6, 5, 4, 3),
                    (4, 3, 5, 7)],
                    dtype=[('BF', '<f8'), ('Lunch', '<f8'), ('Snacks', '<f8'), ('Dinner', '<f8')])
person2 = person1
person3 = person1
person4 = person1
person5 = person1

person = [person1, person2, person3, person4, person5]

age = [10, 20, 30, 40, 50]

np.savez('test.npz', age=age, person=person)

with np.load('test.npz', allow_pickle=False) as data:
    list_person = data['person']
    age_group = data['age']
    # df = pd.DataFrame(list_person)
    # df.to_excel('test.xlsx', index=True)

我期待 'list_person' 作为一个大小为 (5,) 的数组。其中的每个元素都应该有一个形状数组 (7,4)。因此,在导出 excel 时,我得到 (5,1) 数据。

标签: pythonpandasnumpy

解决方案


savez制作所有列表输入的数组;所以这就是你会看到的load

In [105]: np.array(person).shape                                                                             
Out[105]: (5, 7)
In [106]: np.array(person).dtype                                                                             
Out[106]: dtype([('BF', '<f8'), ('Lunch', '<f8'), ('Snacks', '<f8'), ('Dinner', '<f8')])
In [107]: np.array(age).shape                                                                                
Out[107]: (5,)
In [108]: np.array(age).dtype                                                                                
Out[108]: dtype('int64')

person由 5 个副本构成person1,因此结果为 (5,7),并且dtype有 4 个字段(这些不是维度)。

In [112]: df = pd.DataFrame(person1)                                                                         
In [113]: df                                                                                                 
Out[113]: 
    BF  Lunch  Snacks  Dinner
0  1.0    2.0     3.0     4.0
1  4.0    5.0     6.0     5.0
2  7.0    8.0     9.0     6.0
3  9.0    6.0     5.0     4.0
4  6.0    5.0     4.0     3.0
5  6.0    5.0     4.0     3.0
6  4.0    3.0     5.0     7.0

尝试从 (5,7) 数组创建数据框会产生错误。将其展平到 (35,) 确实有效。


推荐阅读