python - 初始化多个 Numpy 数组(多重赋值)——类似于 MATLAB deal()

标签 python matlab numpy initialization variable-assignment

我找不到任何描述如何执行此操作的内容,这导致我相信我没有以正确的惯用 Python 方式执行此操作。也将不胜感激关于“正确的”Python 方法的建议。

我有一堆用于我正在编写的数据记录器的变量(任意记录长度,具有已知的最大长度)。在 MATLAB 中,我会将它们全部初始化为长度为 n 的一维零数组,n 大于我见过的条目数,分配每个单独的元素 variable(measurement_no) = data_point记录循环,并在测量结束时修剪掉多余的零。初始化看起来像这样:

[dData gData cTotalEnergy cResFinal etc] = deal(zeros(n,1));

有没有一种方法可以在 Python/NumPy 中执行此操作,这样我就不必将每个变量都放在自己的行中:

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

我也不想只制作一个大矩阵,因为跟踪哪一列是哪个变量是不愉快的。也许解决方案是制作 (length x numvars) 矩阵,并将列切片分配给各个变量?

编辑:假设在这结束时我将有很多相同长度的向量;例如,我的后处理获取每个日志文件,计算一堆单独的指标(>50),存储它们,并重复直到所有日志都被处理。然后我生成直方图,means/maxes/sigmas/等。对于我计算的所有各种指标。由于在 Python 中初始化 50 多个向量显然并不容易,执行此操作的最佳(最干净的代码和良好的性能)方法是什么?

最佳答案

如果您真的有动力在单行代码中执行此操作,您可以创建一个 (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.zeros(5) 的原因相同。

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

关于python - 初始化多个 Numpy 数组(多重赋值)——类似于 MATLAB deal(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20849351/

相关文章:

python - Scrapy 蜘蛛每页仅抓取一个链接

matlab公式优化: Radial Basis Function

matlab - 如何比较多个向量(不同大小)中的元素?

python - 如何使用 python numpy.savetxt 将字符串和 float 写入 ASCII 文件?

python - Statsmodels:计算拟合值和 R 平方

python - numpy:为什么 (x,1) 和 (x, ) 维度之间存在差异

python - 在 tensorflow 中恢复图形失败,因为没有要保存的变量

Python Pandas - 在 Groupby 内部迭代以查找时间差异

PHP 从一个列表中减去另一个列表

MATLABs 'fminsearch' 不同于 Octave 的 'fmincg'