使用matlab数据结构中的python

2024-09-27 04:28:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在从Matlab转到Python。你知道吗

在Matlab中,我用structs构建了我的数据。 我有一些数据,我想处理得到一个新的数据集。你知道吗

例如。 我从泵上量了一些尺寸。在一个特定的案例中,可能有22点,但这当然是不同的情况下,每个案件。你知道吗

我有一个Excel表格中的数据组织在列中。对于每个数据点,我有流量(q)、高度(h)、扭矩(Torque)和转速(rpm)。我使用xlrd读取数据,这很好。我创建了一个包含四个键的dictionary,其中包含值。你知道吗

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

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

然后我创建了一个空的dict,并用一个np.零长度与输入数据相同的向量。但这似乎不适合我。下面可以看到一个简化的函数。你知道吗

 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

这将返回一个最大字典,但每个键中的值相同。在Matlab中,这项工作很好,但显然不是在这里。然后我和一位同事聊了一会儿,他建议我应该改用课堂。你知道吗

我的问题: 1在Matlab中使用dict作为struct是错误的吗?(我查过了,似乎没有一个明确的答案)。 2为什么密码给我的钥匙都一样? 三。上课是最好的方式吗?你知道吗

希望你能把事情弄清楚一点,这样我就可以开始用Python了!你知道吗


Tags: of数据nonpmaxpointsgeometricrpm
1条回答
网友
1楼 · 发布于 2024-09-27 04:28:19

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

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数据帧可以完成您开箱即用的任务。Python有大量现成的工具,所以如果你想做某事,一定要确保别人以前没有做过。可能有一个或多个工具已经可以让你90%的方式。你知道吗

对于你的第一个问题,是的,如果你真的想用dict作为一个MATLAB结构,你会这样做。但是您通常不想使用dict作为结构,DataFrams和xarray更适合作为MATLAB结构的替代品,并且比MATLAB结构强大得多。你知道吗

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

但是,当您将1数组放入4个python dict值时,它不会复制。最好说,对于同一数组,这些dict键中的每一个都是不同的名称。因此,无论您通过什么键访问它,它仍然会改变相同的底层数组。所以说你有名字和昵称,有人叫你的名字和昵称是指同一个人。与这些数组相同。您可能需要使用您定义的4个独立变量,或者使用zero_array.copy()来创建一个副本。你知道吗

MATLAB方法一开始比较简单,但代价是影响大型阵列的性能。你知道吗

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

Python的主要哲学之一是“你不应该对你的用户撒谎”。在这种情况下,这意味着不要假装做了你做不到的事情,所以numpy在真正制作拷贝时不会假装能够调整数组的大小。如果要将数据复制到新数组,必须显式执行。你知道吗

同样地,MATLAB方法一开始要简单一点,代价是很难判断何时会导致性能下降或内存不足错误,以及导致难以检测和调试错误的风险增加。你知道吗

另外,Python具有可调整大小的数据结构。pythonlist和pythondict(以及许多其他数据类型)都可以调整大小,而无需制作副本。所以,其实没必要让努比假装自己不是

相关问题 更多 >

    热门问题