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

2024-10-08 18:26:58 发布

您现在位置:Python中文网/ 问答频道 /正文

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

num2cell()有什么共识吗?在

我个人认为这违反了Python/numpy语法。我们的想法是:

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

array([[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用户要使用这种数据结构呢?在

纽比的等价物是什么?在


Tags: the代码numpy列表np语法数组array
3条回答

取决于其他代码在做什么。一般来说,Matlab使用单元来表示数组,其中内部数组可以有不同的大小和形状。在

为了回答您的问题,我认为您所做的基本上就是您想要做的,即创建一个数组数组。在

在过去,MATLAB只有一个数据结构,一个矩阵。它可以包含数字或字符,并且总是二维的

添加单元格是为了包含更一般的对象,包括矩阵和字符串。它们还是二维的

Python的列表是1d的,但是可以包含任何内容。numpy是在Python上构建的,添加了多维数组。但名单还是有的。在

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

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

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

^{pr2}$

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

^{3}$

list(A)不常见,当tolist的意思时,可能会出错。在

np.split(A,...)B相似,但子阵列仍然是三维的

unpacking甚至可以工作,基本上是因为A是一个iterable,[a for a in A]在第一个维度上拆分{}。在

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

有一个object dtype,with允许您将对象(包括其他数组)放入数组中。但正如许多问题所表明的那样,这些问题可能很难构建。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)

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

在八度音阶中:

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

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

num2cell本质上取数组中的每个元素,并将其作为单元矩阵中的单个单元来表示。相当于单元格数组的Python是一个列表。因此,如果您真的想在Python中创建一个num2cell等效项,那么您将创建一个与Python NumPy数组具有相同维度的列表,并确保该列表中的每个元素都位于正确的位置。类似这样的方法会起作用:

import numpy as np

def num2cell(a):
    if type(a) is np.ndarray:
        return [num2cell(x) for x in a]
    else:
        return a         

这个递归地遍历NumPy数组的每个维度。对于此数组中维度中的每个元素,如果该元素也是一个数组,则对于下一个维度中的每个元素,转换为列表表示。基本情况是当我们实际碰到一个实际的数字,如果是这样的话,只返回实际的数字。在

下面是在Python工作区中定义num2cell之后的一个工作示例:

^{pr2}$

我们可以看到B是NumPy数组A的列表表示。在

相关问题 更多 >

    热门问题