python—将水平元组转换为numpy数组列的最佳方法

piok6c0g  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(409)
tuple_columns = ('distance', 'speed', 'momentum', 'name', 'friend')
tuple_input = [
(3, 4, 6, 'er', 'ere'),
(3, 4, 6, 'er', 'ere'),
(3, 4, 6, 'er', 'ere'),
(3, 4, 6, 'er', 'ere'),
]

从这个最初是水平元组列表的数据集中创建垂直列的numpy数组的最佳方法是什么?

qlfbtfca

qlfbtfca1#

numpy array不允许使用不同类型的数组,因此不能直接使用同时具有int和str的数组,有一种解决方法:

new_arr = np.array(tuple_input, dtype=object)

它给出以下数组

[[3 4 6 'er' 'ere']
[3 4 6 'er' 'ere']  
[3 4 6 'er' 'ere']  
[3 4 6 'er' 'ere']]

另外,如果希望每个元组都是新数组的列,可以执行以下操作:

new_arr = np.array(tuple_input, dtype=object).T

从而生成以下数组。

[[3 3 3 3]
 [4 4 4 4]
 [6 6 6 6]
 ['er' 'er' 'er' 'er']
 ['ere' 'ere' 'ere' 'ere']]

但是,我想警告您,我个人认为拥有object类型的数组是不好的。在执行某些操作时,它可能有潜在的问题。例如,根据阿斯特里德的评论https://stackoverflow.com/a/44058285/14436930
为了论证,假设你把它变成了一个Dataframe。然后你想过滤数据框中的对象,比如df.loc[(df.col==item)],这是行不通的,因为当pandas进行过滤时,它期望所有的项都是同一类型的。例如,如果在同一列中混合字符串和整数,那么就可以有效地比较苹果和橙子。因此Pandas会抛出一个错误
即使在您的例子中不会引起问题,强制int和str只作为对象也不是一个很好的编程习惯

t40tm48m

t40tm48m2#

您可以像这样直接创建Dataframe:

df = pd.DataFrame(tuple_input)
df.columns = tuple_columns

如果需要numpy数组矩阵,则可以使用:

df_array = df.values

df_array = df.to_numpy()

但是上面的方法不能保留头的值,要保留头,可以使用一个记录数组,它是一个ndarray子类,允许使用属性访问字段。同样地:

df_records = df.to_records(index = False)

相关问题