+-
num2cell()的python / numpy等价物是什么?
我不幸的是通过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只有一个数据结构,一个矩阵.它可能包含数字或字符,并且总是2d.

添加单元格以包含更多通用对象,包括矩阵和字符串.他们仍然是2d.

Python有列表,它是1d,但可以包含任何内容. 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]]]

列表(A)不常见,并且在表示托利斯时可能会错误地使用.

np.split(A,…)类似于B,但子阵列仍然是3d.

解包甚至工作,主要是因为A是可迭代的,[a for a 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]])

有一个对象dtype,允许您将对象(包括其他数组)放入数组中.但正如许多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会话中:

>> 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.]])}

矩阵呈现为2d数组;单元格作为对象类型数组(2d),在这种情况下包含2d数组.

点击查看更多相关文章

转载注明原文:num2cell()的python / numpy等价物是什么? - 乐贴网