首页 > 解决方案 > 使用 Python 将对象数组转换为数组数组

问题描述

我有一个大型 .csv 数据库,其列名 VELOCITY 包含 3D 速度向量。

VELOCITY 列的每个元素的格式为:'(v1, v2, v3)'

要读取我使用的数据:

df = pd.read_csv('database.csv')
df = pd.DataFrame(df)

现在,我尝试定义一个velocity_array,其中每个元素都是3D 速度向量。

velocity_array = np.asarray(df['VELOCITY'])

我得到这样的东西:

['(a1, a2, a3)',
 '(b1, b2, b3)',
 '(c1, c2, c3)',
 .
 .
 .
 '(z1, z2, z3)']

这不是我需要的。我需要一组 3D 速度数组。像这样的东西:

[[a1, a2, a3],
 [b1, b2, b3],
 [c1, c2, c3],
 .
 .
 .
 [z1, z2, z3]]

这样我只能通过调用 velocity_array[i] 来恢复 3D 速度数组。

感谢任何帮助,谢谢!

#=====

只需添加(根据要求):

df.head() 看起来像这样:

     SC_VELOCITY                        EVENT_ID
0   (-7143.645, -825.2191, -2463.361)   388161
1   (-7143.645, -825.2191, -2463.361)   400028
2   (-7087.896, -1058.8871, -2533.3374) 415847
3   (-7024.463, -1291.3812, -2600.547)  527126
4   (-6953.418, -1522.4622, -2664.9265) 605939 

标签: pythonarrayspandasnumpy

解决方案


从您的示例数据中可以看出, 中的每个条目velocity_array都有 2 个单引号将条目括起来,例如'(a1, a2, a3)'。因此,假设您的条目实际上是字符串条目。

如果这是真的,您可以通过以下方式将列中的每个字符串转换为列表:

df['VELOCITY'] = df['VELOCITY'].str.strip("()").str.split(r',\s*')

结果:

velocity_array = np.asarray(df['VELOCITY'])

print(velocity_array)

输出:

[list(['a1', 'a2', 'a3']) list(['b1', 'b2', 'b3'])
 list(['c1', 'c2', 'c3']) list(['z1', 'z2', 'z3'])]

编辑:

如果您的 a1、a2 条目实际上是浮点数,并且您还希望将它们从字符串转换为浮点数,则可以使用:

velocity_array = df['VELOCITY'].str.strip("()").str.split(r',\s*', expand=True).astype(float).to_numpy()

结果:

根据您的样本数据df.head()

print(velocity_array)

[[-7143.645   -825.2191 -2463.361 ]
 [-7143.645   -825.2191 -2463.361 ]
 [-7087.896  -1058.8871 -2533.3374]
 [-7024.463  -1291.3812 -2600.547 ]
 [-6953.418  -1522.4622 -2664.9265]]

推荐阅读