Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 初始化多个Numpy数组(多重赋值)-如MATLAB deal()_Python_Matlab_Numpy_Initialization_Variable Assignment - Fatal编程技术网

Python 初始化多个Numpy数组(多重赋值)-如MATLAB deal()

Python 初始化多个Numpy数组(多重赋值)-如MATLAB deal(),python,matlab,numpy,initialization,variable-assignment,Python,Matlab,Numpy,Initialization,Variable Assignment,我找不到任何描述如何做到这一点的内容,这让我相信我没有以正确的惯用Python方式来做这件事。关于“正确的”Python方法的建议也将不胜感激 我为正在编写的数据记录器提供了一组变量(任意记录长度,具有已知的最大长度)。在MATLAB中,我将它们全部初始化为长度为n的一维零数组,n大于我所看到的条目数,在日志循环中分配每个元素变量(measurement_no)=data_point,并在测量结束时修剪多余的零。初始化过程如下所示: [dData gData cTotalEnergy cResF

我找不到任何描述如何做到这一点的内容,这让我相信我没有以正确的惯用Python方式来做这件事。关于“正确的”Python方法的建议也将不胜感激

我为正在编写的数据记录器提供了一组变量(任意记录长度,具有已知的最大长度)。在MATLAB中,我将它们全部初始化为长度为n的一维零数组,n大于我所看到的条目数,在日志循环中分配每个元素
变量(measurement_no)=data_point
,并在测量结束时修剪多余的零。初始化过程如下所示:

[dData gData cTotalEnergy cResFinal etc] = deal(zeros(n,1));
在Python/NumPy中有没有一种方法可以做到这一点,这样我就不必将每个变量放在自己的行中:

dData = np.zeros(n)
gData = np.zeros(n)
etc.
我也不希望只做一个大矩阵,因为跟踪哪一列是哪一个变量是令人不快的。也许解决方案是制作
(长度x numvars)
矩阵,并将列切片分配给各个变量


编辑:假设在这一切结束时,我将有许多相同长度的向量;e、 例如,我的后处理会获取每个日志文件,计算一组单独的度量(>50),存储它们,并重复,直到所有日志都得到处理。然后,我为我计算的所有各种度量生成直方图、means/maxes/sigmas/等。既然在Python中初始化50+个向量显然不容易,那么最好的(最干净的代码和良好的性能)方法是什么呢?

没有错误或与Python无关

dData = np.zeros(n)
gData = np.zeros(n)
etc.
你可以把它们放在一行,但没有特别的理由这样做

dData, gData = np.zeros(n), np.zeros(n)
不要尝试
dData=gData=np.zero(n)
,因为对
dData
的更改会更改
gData
(它们指向相同的对象)。出于同样的原因,您通常不想使用
x=y=[]

MATLAB中的
deal
很方便,但并不神奇。下面是八度音阶是如何实现的

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
与Python相反,使用八度音阶(大概是MATLAB)

为3个变量指定不同的对象


还请注意MATLAB如何将
deal
作为分配单元格和结构数组内容的一种方式

如果你真的想在一行中这样做,你可以创建一个由零组成的
(n_vars,…)
数组,然后沿着第一个维度展开:

a, b, c = np.zeros((3, 5))
print(a is b)
# False
另一个选项是使用列表理解或生成器表达式:

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
不过要小心!您可能认为,在包含对
np.zeros()
的调用的列表或元组上使用
*
运算符可以实现同样的效果,但它没有:

h, i, j = (np.zeros(5),) * 3
print(h is i)
# True
这是因为首先计算元组中的表达式
np.zeros(5)
因此只调用一次,重复元组中的每个元素最终都是对同一数组的引用。这就是为什么不能只使用
a=b=c=np.zero(5)


除非您真的需要分配大量空数组变量,并且您真的非常关心代码的紧凑性(!),否则我建议您在单独的行上对它们进行初始化以提高可读性。

如果您将数据放入
集合中。defaultdict
您将不需要进行任何显式初始化。所有内容都将在第一次使用时初始化

将numpy导入为np
导入集合
n=100
data=collections.defaultdict(lambda:np.zeros(n))
对于范围(1,n)内的i:
数据['g'][i]=数据['d'][i-1]
# ...

使用
地图如何

import numpy as np
n = 10  # Number of data points per array
m = 3   # Number of arrays being initialised
gData, pData, qData = map(np.zeros, [n] * m)

这和我想做的最接近。在我的其他一些Matlab代码中——用来分析数据记录器输出的东西——我最终创建了大量向量来存储每次运行的计算指标。它们都被初始化为一个大的
交易的一部分(零(n,1))
,我宁愿不必记录作业左侧有多少个。我觉得我应该用一个结构来代替,但是Matlab的语法让这有点痛苦。请参阅我的问题的编辑。对不起,您必须跟踪您自己在LHS上分配了多少变量。问题是,在Python中,被调用的函数不知道将如何处理返回值,因此它不知道LHS上需要多少。把它看作是你有能力做一个函数调用中的索引之类的事情的代价。你可以考虑使用A来跟踪多个向量的相同长度的空向量,不同的“列名称”谢谢,我很欣赏这个关于事务的讨论()。我标记了另一个答案,但我发现这个答案也非常有用,我希望我不必只选择一个。
import numpy as np
n = 10  # Number of data points per array
m = 3   # Number of arrays being initialised
gData, pData, qData = map(np.zeros, [n] * m)