我正在从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了!你知道吗
我将首先回答您的最后一个问题:实现这一点的最佳方法是使用数据帧。您可以直接将excel电子表格作为数据框导入,然后根据需要添加列。因此,可以执行以下操作向现有数据中添加列:
您可以创建一个类来处理这个问题,但这将更加复杂,因为pandas数据帧可以完成您开箱即用的任务。Python有大量现成的工具,所以如果你想做某事,一定要确保别人以前没有做过。可能有一个或多个工具已经可以让你90%的方式。你知道吗
对于你的第一个问题,是的,如果你真的想用dict作为一个MATLAB结构,你会这样做。但是您通常不想使用dict作为结构,DataFrams和xarray更适合作为MATLAB结构的替代品,并且比MATLAB结构强大得多。你知道吗
对于第二个问题,原因是您定义了5个变量,
zero_vector
、q
、h
、torque
和rpm
,但您只使用过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(以及许多其他数据类型)都可以调整大小,而无需制作副本。所以,其实没必要让努比假装自己不是
相关问题 更多 >
编程相关推荐