【问题标题】:Using python coming from matlab - datastructure使用来自matlab的python——数据结构
【发布时间】:2017-02-04 04:56:27
【问题描述】:

我正在从 Matlab 转移到 Python。

在 Matlab 中,我将数据结构化为结构。 我有一些数据要处理以获取新数据集。

例如 我有一些泵的测量值。在特定情况下,可能有 22 分,但这当然因情况而异。

我将 Excel 工作表中的数据按列组织。对于每个数据点,我都有流量 (q)、高度 (h)、扭矩 (torque) 和 rpm (rpm)。我使用 xlrd 读取数据,这工作正常。我用四个键创建了一个字典,其中的值。

有一些缩放规则可用于操作给定的数据集点。在 Matlab 中,我将数据组织在一个名为液压数据的结构文件中,然后会有 4 个向量,即液压数据.q 等。

第一种方法是在 python 中使用 dict。这里的问题是必须定义键的长度,即您不能将数据添加到列表中。

然后我创建了一个空字典。并用长度与输入数据相同的 np.zeros 向量填充。但这似乎对我不起作用。一个简化的函数如下所示。

 def test_for_loop(hydraulic_geometric_scaled):
    import math
    import numpy as np
    no_of_points = len(hydraulic_geometric_scaled['q'])
    zero_vector = np.zeros(no_of_points)
    q = np.zeros(no_of_points)
    h = np.zeros(no_of_points)
    torque = np.zeros(no_of_points)
    rpm = np.zeros(no_of_points)
    hydraulic_scaling_max = {}
    hydraulic_scaling_max['q'] = zero_vector
    hydraulic_scaling_max['h'] = zero_vector
    hydraulic_scaling_max['torque'] = zero_vector
    hydraulic_scaling_max['rpm'] = zero_vector
    rpm_max=6000
    for i in range(no_of_points):
        omega = hydraulic_geometric_scaled['rpm'][i]/60*2*math.pi
        omega_max = rpm_max/60*2*math.pi
        hydraulic_scaling_max['q'][i]= hydraulic_geometric_scaled['q'][i]*(omega_max/omega)
        hydraulic_scaling_max['h'][i]= hydraulic_geometric_scaled['h'][i]*(omega_max/omega)**2
        hydraulic_scaling_max['torque'][i]= hydraulic_geometric_scaled['torque'][i]*(omega_max/omega)**2
        hydraulic_scaling_max['rpm'][i]= omega_max*60/2/math.pi
    return hydraulic_scaling_max

这会返回一个hydraulic_scaling_max 字典,但每个键的值都相同。在 Matlab 中,这项工作很好,但显然不在这里。然后我和一位同事谈了一点,他建议我应该改用类。

我的问题: 1.在Matlab中使用dict作为结构是错误的方式吗? (我已经搜索过,似乎没有明确的答案)。 2. 为什么所有键的代码都一样? 3. 上课是最好的方式吗?

希望你能把事情弄清楚一点,这样我就可以开始使用 Python 的最佳方式了!

【问题讨论】:

  • 您能否澄清一下,“这里的问题是必须定义键的长度,即您不能将数据添加到列表中。”?我不确定你在这里说什么,它可能会帮助我们找到你遇到的问题。
  • @MarkHarley:我很确定他指的是无法调整大小的 numpy 数组

标签: python matlab dictionary


【解决方案1】:

我将首先回答您的最后一个问题:实现这一点的最佳方法是使用 pandas DataFrame。您可以直接将 Excel 电子表格作为 DataFrame 导入,然后根据需要添加列。因此,您可以执行以下操作向现有数据添加列:

from math import pi
import pandas as pd

# load the excel file, you will need to adjust this to fit your file
hydraulic_geometric_scaled = pd.read_excel('filename.xls')

rpm_max=6000
omega_max = rpm_max/60*2*pi

omega = hydraulic_geometric_scaled['rpm']/60*2*pi

# you re-use this a lot so it is faster to define it once
factor = omega_max/omega

# copy the columns you want, and apply the scaling factors
hydraulic_scaling_max = hydraulic_geometric_scaled.loc[:,('q','h','rpm','torque')]*[factor, factor**2, 1, factor**2]

# overwrite this column with constant values
hydraulic_scaling_max['rpm'] = rpm_max

你可以创建一个类来处理这个问题,但它会复杂得多,因为 pandas DataFrame 会开箱即用地满足你的需要。 Python 有大量现成的工具,所以如果你想做某事,一定要确保它以前没有被其他人做过。可能已经有一种或多种工具可以帮助您完成 90% 的任务。

对于您的第一个问题,是的,如果您真的想将 dict 用作​​ MATLAB 结构,那么您会这样做。但是您通常不想将 dict 用作​​结构体,pandas DataFrams 和 xarray 更适合作为 MATLAB 结构体的替代品,并且比 MATLAB 结构体更强大。

对于第二个问题,原因是您定义了 5 个变量,zero_vectorqhtorquerpm,但您只使用过 zero_vector。在 MATLAB 中,将其放入 struct 4 次将生成数组的副本,因此它需要 4 倍的内存,但对一个副本的更改不会影响其他副本。

但是,当您将 1 数组放入 4 个 python dict 值时,它不会复制。最好说这些 dict 键中的每一个都是同一个数组的不同名称。因此,无论您使用什么键访问它,它仍然会更改相同的底层数组。所以说你有一个名字和一个昵称,有人用名字和昵称称呼你是指同一个人。与这些数组相同。您要么需要使用您定义的 4 个单独变量,要么使用 zero_array.copy() 进行复制。

起初,MATLAB 方法稍微容易一些,但代价是会损害大型数组的性能。

此外,虽然这不是一个问题,但 MATLAB 允许您(似乎)调整矩阵大小而 numpy 不允许您调整数组大小的原因是 Python 倾向于更预先了解其功能。严格来说,MATLAB 和 Python 都不允许您调整数组的大小。 MATLAB 假装让您调整它们的大小,因为该语言没有真正可调整大小的数据结构。然而,实际发生的是,在幕后,MATLAB 实际上每次通过循环创建一个全新的数组,将所有数据复制到新数组,然后在某个时候释放旧数组上的内存。这非常慢,这就是为什么 MATLAB 编辑器会警告您不要这样做。实际上,在向结构中添加新字段时也会出现同样的问题,尽管通常字段较少,所以这通常不是什么大问题。

Python 的主要理念之一是“您不应该对用户撒谎”。在这种情况下,这意味着不要假装做你不能做的事情。所以 numpy 在真正制作副本时不会假装能够调整数组的大小。如果你想将数据复制到一个新的数组中,你必须明确地这样做。

同样,MATLAB 方法一开始更容易一些,但代价是很难判断何时会降低性能或出现内存不足错误,并且会增加导致难以检测和难以检测的风险调试错误。

另外,Python 具有可调整大小的数据结构。 Python list 和 python dict(以及许多其他数据类型)都可以调整大小而无需复制。所以真的没有必要让 numpy 假装它不是。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-03
    • 2021-09-01
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    相关资源
    最近更新 更多