当前位置: 首页 > 知识库问答 >
问题:

初始化多个Numpy数组(多个赋值)-像MATLAB处理()

林修真
2023-03-14

我找不到任何描述如何做到这一点的内容,这让我相信我没有以正确的惯用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、 例如,我的后处理会获取每个日志文件,计算一系列单独的指标(

共有3个答案

景宏朗
2023-03-14

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

import numpy as np
import collections
n = 100
data = collections.defaultdict(lambda: np.zeros(n))
for i in range(1, n):
    data['g'][i] = data['d'][i - 1]
    # ...
姬魁
2023-03-14

没有任何错误或不符合Pythonic的

dData = np.zeros(n)
gData = np.zeros(n)
etc.

你可以把它们放在一行,但是没有特别的理由这样做。

dData, gData = np.zeros(n), np.zeros(n)

不要尝试dData=gData=np。零(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)

one=two=three=zeros(1,3)

为3个变量分配不同的对象。

还请注意MATLAB如何将处理作为分配单元格和结构数组内容的一种方式。http://www.mathworks.com/company/newsletters/articles/whats-the-big-deal.html

许焕
2023-03-14

如果你真的有动力用一行代码来做这件事,你可以创建一个(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。因此,0(5)只被调用一次,重复元组中的每个元素最终都是对同一数组的引用。这就是为什么不能只使用a=b=c=np的原因。零(5)

除非你真的需要分配大量的空数组变量,并且你真的非常关心代码的紧凑性(!),为了便于阅读,我建议在单独的行中对它们进行初始化。

 类似资料:
  • 我需要初始化具有相同形状的多个Numpy数组。想知道哪种方式是最好的: 为每个人写一行: 或者有更好的方法?

  • 问题内容: 有没有办法初始化形状的numpy数组并将其添加到其中?我将通过列表示例解释我需要的内容。如果要创建循环中生成的对象列表,可以执行以下操作: 我想对一个numpy数组做类似的事情。我了解vstack,串联等。但是,这些似乎需要两个numpy数组作为输入。我需要的是: 本应具有的形状。这该怎么做? 编辑: 我想添加以下说明。我知道我可以定义然后填充它。但是,这需要预先指定big_array

  • 我必须用Python写一个基于代理的模型项目,我需要初始化50个代理,每个代理都包含一组不同的数字。我不能使用50行的矩阵,因为每个代理(每行)可以有不同数量的元素,所以每个代理的向量长度不一样:当算法中出现agent_i的某些条件时,然后将算法计算的一个数字添加到它的向量中。最简单的方法是手动编写每一个这样的 但我当然不能。我不知道是否存在一种通过循环自动初始化的方法,比如 如果它存在,它将是有

  • 问题内容: 声明多维数组并为其分配值的正确方法是什么? 这就是我所拥有的: 问题答案: 尝试将适当的行替换为: 您的代码不正确,因为子数组的长度为y,索引从0开始。因此,设置为或将失败,因为索引和超出范围。 ;是初始化矩形多维数组的正确方法。如果希望将其锯齿状(每个子数组的长度可能不同),则可以使用类似于此答案的代码。但是请注意,如果您想要一个完美的矩形多维数组,John关于必须手动创建子数组的主

  • 问题内容: 这非常丑陋: 有没有办法在一行上声明这些变量? 问题答案: 上述方法的缺点是,您需要计算左侧的名称数,并且在右侧具有完全相同数量的空列表(例如,通过调用或更明确地)。 最主要的是, 不要 使用类似 也不 这将使所有名称都引用 相同的 空列表!

  • windows操作系统下无法在一个php文件里初始化多个Worker, 例如下面test.php <?php ... $socket_server = new Worker("tcp://0.0.0.0:5555"); $socket_server->on.... $websocket_server = new Worker("websocket://0.0.0.0:6666"); $websoc