如何在 for 循环中添加不同大小的 numpy 数组条目(类似于 Matlab 的单元格数组)?

Posted

技术标签:

【中文标题】如何在 for 循环中添加不同大小的 numpy 数组条目(类似于 Matlab 的单元格数组)?【英文标题】:How to add to numpy array entries of different size in a for loop (similar to Matlab's cell arrays)? 【发布时间】:2015-10-08 12:40:12 【问题描述】:

我正在尝试在 python \ numpy 中实现对 Matlab 单元数组的模拟。 Matlab 代码会这样:

for n=1:10
    Cn = rand(1,n);
end

请注意,每个单元格元素都有不同的长度。现在在 numpy 中:

for n in np.arange(10):
    C[n] = np.random.rand(1,n)

我得到一个错误,我该怎么做才能实现它?

【问题讨论】:

见***.com/questions/1761419/… 【参考方案1】:

在大多数简单的情况下,您可以只使用标准的 Python 列表。它们与 Matlab 单元数组非常相似,您可以使用它们来存储任何内容:

C = []
for n in np.arange(10):
    C.append(np.random.rand(1,n))

如果列表不太长并且只有一个维度(所以只是一个向量),这将是一个不错的选择。请注意,在 Python 中,您通常不会预先分配最终大小的列表,而只是附加到一个空列表。 Python 列表针对追加到末尾进行了优化,它们已经在后台进行了某种预分配。

如果您正在翻译具有多维或非常大的单元数组的 Matlab 代码,您可以使用带有 dtype=object 的 numpy 数组:

m, n = 3, 6
C = np.empty((m, n), dtype=object)
for i in xrange(m):
    for j in xrange(n):
        C[i, j] = np.random.rand(i, j)

【讨论】:

【参考方案2】:

您正在使用列表。因此,在该循环内使用[n] 对其进行索引之前,您需要初始化该列表。初始化列表的方法之一是这样的 -

C = [None]*10 # Here 10 is the length of the list

【讨论】:

以上是关于如何在 for 循环中添加不同大小的 numpy 数组条目(类似于 Matlab 的单元格数组)?的主要内容,如果未能解决你的问题,请参考以下文章

在循环中附加具有不同维度的numpy ndarray

如何使用 Python 多处理 Pool.map 在 for 循环中填充 numpy 数组

同时分配 numpy/torch 轴的多个不同切片

如何使用for循环创建一定长度的numpy数组(或pandas数据框)?

在 Python 中通过线程/核心/节点并行化 for 循环

附加一个具有不同第一维的numpy数组