不规则Numpy矩阵

不规则Numpy矩阵,numpy,matrix,Numpy,Matrix,在Numpy中,似乎矩阵可以是任何东西的嵌套列表,而不限于数字。比如说 import numpy as np a = [[1,2,5],[3,'r']] b = np.matrix(a) 不会引起任何抱怨 当列表可以在严格的数学意义上处理非矩阵的对象时,该公差的目的是什么 您创建的是一个对象数据类型数组: In [302]: b=np.array([[1,2,5],[3,'r']]) In [303]: b Out[303]: array([[1, 2, 5], [3, 'r']], dty

在Numpy中,似乎矩阵可以是任何东西的嵌套列表,而不限于数字。比如说

import numpy as np

a = [[1,2,5],[3,'r']]
b = np.matrix(a)
不会引起任何抱怨


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

您创建的是一个对象数据类型数组:

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
方法,而是有所有数组方法,如
.restrape

对于许多操作,
numpy
将这样一个数组视为一个列表——在指针上迭代,等等。许多处理数值的数学操作在对象数据类型上失败

为什么允许这样?在某种程度上,它只是一种泛化,将元素值/数据类型的概念扩展到了简单的数字和字符串之外
numpy
还允许复合数据类型(结构化数组)。MATLAB扩展了他们的矩阵类,以包括类似的
单元

我看到很多关于对象数组的问题。有时它们是在错误中产生的

有时它们是故意创造的
pandas
随时将数据系列更改为对象数据类型,以适应混合值(字符串、nan、int)

np.array()。事实上,当子列表都相同时,您必须求助于特殊的构造方法来创建对象数组

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

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)

这是因为有时候你想存储一般的对象(比如字符串或者更一般的东西)。它不仅仅用于数学矩阵运算。@sascha:我的问题是,这些情况已经可以通过通用Python中的list来处理了。为什么我们需要另一个单独的治疗呢?我可以看出,如果,比方说,把矩阵运算推广到函数矩阵中,目的何在。但是我不认为Numpy是这样对待函数的。你也可以使用一个列表(列表列表)进行矩阵乘法,那么为什么要使用Numpy呢?@sascha:一个预先编写的函数,比如Numpy中的函数,将一个操作序列模块化,这样整个序列就可以重复使用。它通过压缩节省了编码工作。然而,这里没有这样的压缩和省力。如果你不这么想,请解释一下。例如:古罗比的数学规划。回到过去,也许直到今天,只有一些基于dict的结构用于存储所有变量以建立约束(我不喜欢)。因此,我只是将变量对象放入一些numpy数组中,这些数组只有在支持通用对象类型时才起作用(因为gurobi变量不是本机python类型)。所以现在我得到了一个很好的变量数组/张量,可以做所有疯狂的索引工作,当然还有基于对象的numpy数据上的np.dot(a,b),因为这些变量对象重载+和co.nice。从未见过
\uuuuu数组\u接口\uuuuu
。这也是一个好的和清晰的解释。