gpt4 book ai didi

python - num2cell() 的 python/numpy 等价物是什么?

转载 作者:太空宇宙 更新时间:2023-11-03 13:35:38 25 4
gpt4 key购买 nike

我很不幸通过 numpy 数组将一些 MATLAB 代码转换为 Python。

num2cell() 是否有共识?

就我个人而言,我认为这违背了 Python/numpy 语法。这个想法是这样的:

使用 num2cell,您将得到一个如下所示的数组

数组([[0],[1],[2],[3],[4],[5],[6],[7],[8]])

参见 the MathWorks documentaiton .

你可以在 numpy 中通过列表理解来做到这一点:

matlab_lunacy = np.array([[x] for x in range(0, 9)]

但为什么 MATLAB 用户要使用这种数据结构呢?

什么是 numpy 等价物?

最佳答案

在过去的美好时光(大约 3.0 版),MATLAB 只有一种数据结构,即矩阵。它可以包含数字或字符,并且始终是二维的。

添加了单元格以包含更多通用对象,包括矩阵和字符串。他们仍然是二维的。

Python 有列表,它们是一维的,但可以包含任何内容。 numpy 基于 Python 构建,添加了多维数组。但列表仍然可用。

因此,任何将数组转换为列表的东西都可能等同于 num2cell - 不准确,但具有重叠的功能。

In [246]: A=np.arange(24).reshape(2,3,4)   # 3d array

包装在一个列表中,给我们一个包含 2 个数组 (2d) 的列表:

In [247]: B=list(A)
In [248]: B
Out[248]:
[array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]]),
array([[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]])]

tolist 方法执行到列表(嵌套)的完全转换。

In [249]: C=A.tolist()
In [250]: C
Out[250]:
[[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]],
[[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]]

list(A) 不常用,在表示 tolist 时可能会用错。

np.split(A,...) 类似于B,但子数组仍然是 3d。

解包 甚至可以工作,主要是因为 A 是可迭代的,[a for a in A] 拆分 A 在第一个维度上。

In [257]: a,b=A
In [258]: a
Out[258]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])

有一个对象数据类型,可以让您将对象(包括其他数组)放入数组中。但正如许多 SO 问题所示,这些问题的构建可能很棘手。 np.array 尝试构建最高维度的数组。您必须执行一些技巧来解决这个问题。

In [259]: Z=np.empty((2,),dtype=object)
In [260]: Z
Out[260]: array([None, None], dtype=object)
In [261]: Z[0]=A[0]
In [262]: Z[1]=A[1]
In [263]: Z
Out[263]:
array([ array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]]),
array([[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]])], dtype=object)

================

在 Octave session 中:

>> anum = [1,2,3,4]
anum =

1 2 3 4

>> acell = num2cell(anum)
acell =
{
[1,1] = 1
[1,2] = 2
[1,3] = 3
[1,4] = 4
}
>> save -7 test.mat anum acell

scipy.io.loatmat 版本

In [1822]: data = io.loadmat('../test.mat')
In [1823]: data
Out[1823]:
{'__globals__': [],
'__header__': b'MATLAB 5.0 MAT-file, written by Octave 4.0.0,
2016-10-27 00:59:27 UTC',
'__version__': '1.0',
'acell': array([[array([[ 1.]]), array([[ 2.]]), array([[ 3.]]),
array([[ 4.]])]], dtype=object),
'anum': array([[ 1., 2., 3., 4.]])}

矩阵被呈现为二维数组; cell 作为对象类型数组 (2d),在本例中包含二维数组。

关于python - num2cell() 的 python/numpy 等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40266943/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com