sch*_*dge 8 python matlab numpy initialization variable-assignment
我无法找到任何描述如何执行此操作的内容,这导致相信我不是以正确的惯用Python方式执行此操作.关于'正确'Python方法的建议也将受到赞赏.
对于我正在编写的数据记录器,我有一堆变量(任意记录长度,已知最大长度).在MATLAB中,我将它们全部初始化为长度为n的n的一维数组,n大于我将看到的条目数,variable(measurement_no) = data_point
在记录循环中分配每个单独的元素,并在测量时修剪掉外来的零.过度.初始化将如下所示:
[dData gData cTotalEnergy cResFinal etc] = deal(zeros(n,1));
Run Code Online (Sandbox Code Playgroud)
有没有办法在Python/NumPy中执行此操作,因此我不必将每个变量放在自己的行上:
dData = np.zeros(n)
gData = np.zeros(n)
etc.
Run Code Online (Sandbox Code Playgroud)
我也不想只做一个大矩阵,因为跟踪哪个列是哪个变量令人不愉快.也许解决方案是制作(length x numvars)
矩阵,并将列切片分配给各个变量?
编辑:假设在结束时我将会有很多相同长度的向量; 例如,我的后处理采用每个日志文件,计算一堆单独的度量(> 50),存储它们,并重复,直到所有日志都被处理完毕.然后我生成直方图,平均值/ maxes/sigmas /等.对于我计算的所有各种指标.由于在Python中初始化50多个向量显然不容易,这样做的最佳(最干净的代码和不错的性能)方法是什么?
ali*_*i_m 12
如果您真的有动力在单行中执行此操作(n_vars, ...)
,则可以创建一个零数组,然后沿第一维解压缩它:
a, b, c = np.zeros((3, 5))
print(a is b)
# False
Run Code Online (Sandbox Code Playgroud)
另一种选择是使用列表推导或生成器表达式:
a, b, c = [np.zeros(5) for _ in range(3)] # list comprehension
d, e, f = (np.zeros(5) for _ in range(3)) # generator expression
print(a is b, d is e)
# False False
Run Code Online (Sandbox Code Playgroud)
不过要小心!您可能认为*
在包含调用的列表或元组上使用运算符np.zeros()
将实现相同的目的,但它不会:
h, i, j = (np.zeros(5),) * 3
print(h is i)
# True
Run Code Online (Sandbox Code Playgroud)
这是因为首先评估元组内的表达式.np.zeros(5)
因此只调用一次,重复元组中的每个元素最终成为对同一数组的引用.这就是为什么你不能只使用它的原因a = b = c = np.zeros(5)
.
除非你真的需要分配大量的空数组变量,并且你真的非常关心使代码紧凑(!),我建议在不同的行上初始化它们以便于阅读.
没有错误或没有Pythonic与
dData = np.zeros(n)
gData = np.zeros(n)
etc.
Run Code Online (Sandbox Code Playgroud)
你可以将它们放在一条线上,但没有特别的理由这样做.
dData, gData = np.zeros(n), np.zeros(n)
Run Code Online (Sandbox Code Playgroud)
不要尝试dData = gData = np.zeros(n)
,因为更改dData
更改gData
(它们指向同一个对象).出于同样的原因,您通常不想使用x = y = []
.
该deal
在MATLAB是一种方便,但并不神奇.以下是Octave如何实现它
function [varargout] = deal (varargin)
if (nargin == 0)
print_usage ();
elseif (nargin == 1 || nargin == nargout)
varargout(1:nargout) = varargin;
else
error ("deal: nargin > 1 and nargin != nargout");
endif
endfunction
Run Code Online (Sandbox Code Playgroud)
与Python相比,在Octave中(可能是MATLAB)
one=two=three=zeros(1,3)
Run Code Online (Sandbox Code Playgroud)
为3个变量分配不同的对象.
另请注意MATLAB如何deal
作为分配单元格和结构数组内容的方式. http://www.mathworks.com/company/newsletters/articles/whats-the-big-deal.html