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数组的最佳方法是什么?
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只作为对象也不是一个很好的编程习惯
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)
2条答案
按热度按时间qlfbtfca1#
numpy array不允许使用不同类型的数组,因此不能直接使用同时具有int和str的数组,有一种解决方法:
它给出以下数组
另外,如果希望每个元组都是新数组的列,可以执行以下操作:
从而生成以下数组。
但是,我想警告您,我个人认为拥有object类型的数组是不好的。在执行某些操作时,它可能有潜在的问题。例如,根据阿斯特里德的评论https://stackoverflow.com/a/44058285/14436930
为了论证,假设你把它变成了一个Dataframe。然后你想过滤数据框中的对象,比如df.loc[(df.col==item)],这是行不通的,因为当pandas进行过滤时,它期望所有的项都是同一类型的。例如,如果在同一列中混合字符串和整数,那么就可以有效地比较苹果和橙子。因此Pandas会抛出一个错误
即使在您的例子中不会引起问题,强制int和str只作为对象也不是一个很好的编程习惯
t40tm48m2#
您可以像这样直接创建Dataframe:
如果需要numpy数组矩阵,则可以使用:
或
但是上面的方法不能保留头的值,要保留头,可以使用一个记录数组,它是一个ndarray子类,允许使用属性访问字段。同样地: