use*_*604 0 python matlab numpy
我是一个精通MATLAB的人,但我正试图将这些技能转移到Python,希望未来的就业前景.例如,在进行机器学习时,我喜欢MATLAB,因为我可以使我的功能看起来像下面一样干净,例如:
main.m
------------
prescreen_fn(directory,threshold) %a prescreen function that is run
plot_prescreen_hits(directory) %plot and print prescreen hits
extract_features(directory,fft_size) %extract features from prescreen hit locations
generate_train_test(directory) %parse training and testing data
SVM_train_test(directory) %perform SVM training and testing
-----------
Run Code Online (Sandbox Code Playgroud)
好吧,你明白了.拥有一个干净的主函数很好,因此很容易传递用户定义的变量等.
问题是我不知道在python中执行此操作的最佳方法.我已经阅读了所有堆栈交换如何从其他脚本调用python脚本是不好的,即使那时传递变量也很困难.另外,我不想有一些大型脚本,我在上面定义了很多python代码,然后在同一个脚本中调用它们.
如果这是非常模糊的道歉,但是python"应该"看起来的一般结构让我感到困惑
谢谢
您的问题可能会因为偏离主题或过于宽泛而被关闭,但我认为这是一个很好的问题,如果将其改为"这个代码的python等价物".
一般来说,这是来自matlab的很多人都会感到困惑的事情.在python中,事物被分成"名称空间",你需要从其他文件中显式地导入函数/变量/ etc.
在matlab中(如果我没记错的话),你不能在同一个文件中使用"bare"语句.在python中你可以.但是,您无法在定义函数之前调用它.
换句话说,你可以这样做:
def foo():
print 'bar'
foo()
Run Code Online (Sandbox Code Playgroud)
但不是:
foo()
def foo():
print 'bar'
Run Code Online (Sandbox Code Playgroud)
因此,因为您通常希望在文件顶部使用"大纲级别"代码,所以通常将其放入函数中,然后在定义其他函数后在底部调用该函数.通常情况下,您可以调用此功能main,但您可以根据自己的喜好自由命名.
作为一个简单的例子:
def main():
directory = load_data()
threshold, fft_size = 10, 1000
prescreen_fn(directory,threshold)
plot_prescreen_hits(directory)
extract_features(directory,fft_size)
generate_train_test(directory)
SVM_train_test(directory)
def prescreen_fn(directory, threshold):
"""A prescreen function that is run. Ideally this would be a
more informative docstring."""
pass
def plot_prescreen_hits(directory):
pass
def extract_features(directory,fft_size):
pass
def generate_train_test(directory):
pass
def SVM_train_test(directory):
pass
def load_data():
pass
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
最后一部分可能看起来有点令人困惑.所说的基本上是"只有在直接运行此文件时才执行此块中的代码.如果我们只是从中导入函数,请不要运行任何东西." (对此有很多解释,例如,如果__name__ =="__ main__":怎么办?)
如果你想,你可以这样做:
def main():
...
def other_things():
...
main()
Run Code Online (Sandbox Code Playgroud)
如果您只是运行该文件,您将得到相同的结果.不同之处在于我们从其他地方导入此代码时会发生什么.(在第一个例子中,在第二个例子中main不会被调用.)
随着事情的发展,您可能决定将其中的一部分拆分为单独的文件.例如,我们可能会将一些函数放在一个名为的文件中,data.py而将其他函数放在一个名为的文件中model.py.然后我们可以将这些文件中的函数导入到另一个建立"管道"的文件中(我们甚至可以称之为"管道" main.py,或者可能是更具描述性的文件).
与matlab不同,我们需要明确import这些文件.我不会在这里详细介绍,但是import基本上会尝试在"库"位置找到一个具有指定名称的文件或包(具有特定结构的目录),然后在与正在运行的文件相同的目录中(在2.7中更改了首选项顺序 - 用于取代库文件的本地文件).
在下面的示例中,import data将导入文件中的函数和变量"data.py"(并且相同import model).该文件中的函数等在一个名为"名称空间"的函数中,data因此我们需要以这种方式引用它们.(请注意,您可以from data import *将它们带入全局命名空间,但除非您处于交互式shell中,否则您确实应该避免这种情况.)
import data
import model
directory = data.load_data()
threshold, fft_size = 10, 1000
data.prescreen_fn(directory, threshold)
data.plot_prescreen_hits(directory)
data.extract_features(directory, fft_size)
model.generate_train_test(directory)
model.SVM_train_test(directory)
Run Code Online (Sandbox Code Playgroud)
请注意,我没有费心将这个包装成一个main函数.我们当然可以.我在这里没有这样做的原因是你可能不想从这个简短的"main.py"文件中导入一些东西.因此,我们不需要在if __name__ == '__main__':有条件的情况下运行.
希望这些例子有助于澄清一些事情.