不规则的Numpy矩阵

时间:2016-11-17 23:09:16

标签: numpy matrix

在Numpy中,矩阵似乎只是一个嵌套的列表,不包括数字。例如

import numpy as np

a = [[1,2,5],[3,'r']]
b = np.matrix(a)

不会产生投诉。

当列表可以在严格的数学意义上处理非矩阵的对象时,这种容差的目的是什么?

1 个答案:

答案 0 :(得分:1)

您创建的是对象dtype数组:

In [302]: b=np.array([[1,2,5],[3,'r']])
In [303]: b
Out[303]: array([[1, 2, 5], [3, 'r']], dtype=object)
In [304]: b.shape
Out[304]: (2,)
In [305]: b[0]
Out[305]: [1, 2, 5]
In [306]: b[1]=None
In [307]: b
Out[307]: array([[1, 2, 5], None], dtype=object)

这个数组的元素是指针 - 指向内存中对象的指针。它有一个数据缓冲区就像其他数组一样。在这种情况下,2个指针,2

In [308]: b.__array_interface__
Out[308]: 
{'data': (169809984, False),
 'descr': [('', '|O')],
 'shape': (2,),
 'strides': None,
 'typestr': '|O',
 'version': 3}
In [309]: b.nbytes
Out[309]: 8
In [310]: b.itemsize
Out[310]: 4

它非常像列表 - 它还将对象指针存储在缓冲区中。但它的不同之处在于它没有append方法,但确实拥有像.reshape这样的所有数组方法。

对于许多操作,numpy将这样的数组视为列表 - 迭代指针等。许多使用数值的数学运算都会失败,并带有对象dtypes。

为什么允许这个?部分地,它只是一个概括,将元素值/ dtypes的概念扩展到简单的数字和字符串之外。 numpy也允许复合dtypes(结构化数组)。 MATLAB将它们的矩阵类扩展为包含cells,它们是相似的。

我看到很多关于对象数组的问题。有时它们是错误产生的,Creating numpy array from list gives wrong shape

有时它们是故意创造的。 pandas可以轻松地将数据系列更改为对象dtype以适应值的混合(string,nan,int)。

np.array()尝试创建尽可能高的维度数组,仅在它不能使用时才使用对象dtype,例如当子列表的长度不同时。事实上,当子列表完全相同时,你必须求助于特殊的构造方法来创建一个对象数组。

这仍然是一个对象数组,但维度更高:

In [316]: np.array([[1,2,5],[3,'r',None]])
Out[316]: 
array([[1, 2, 5],
       [3, 'r', None]], dtype=object)
In [317]: _.shape
Out[317]: (2, 3)