在Numpy中,矩阵似乎只是一个嵌套的列表,不包括数字。例如
import numpy as np
a = [[1,2,5],[3,'r']]
b = np.matrix(a)
不会产生投诉。
当列表可以在严格的数学意义上处理非矩阵的对象时,这种容差的目的是什么?
答案 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)