初始化多个Numpy数组(多个赋值) - 就像MATLAB交易()

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).

除非你真的需要分配大量的空数组变量,并且你真的非常关心使代码紧凑(!),我建议在不同的行上初始化它们以便于阅读.


hpa*_*ulj 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