Python中的矩阵

时间:2009-04-04 01:21:37

标签: python matrix

昨天我需要Python中的矩阵类型。

显然,对此需求的一个简单回答是使用numpy.matrix(),但我的另一个问题是我想要一个矩阵来存储混合类型的任意值,类似于列表。 numpy.matrix不执行此操作。一个例子是

>>> numpy.matrix([[1,2,3],[4,"5",6]])
matrix([['1', '2', '3'],
        ['4', '5', '6']], 
       dtype='|S4')
>>> numpy.matrix([[1,2,3],[4,5,6]])
matrix([[1, 2, 3],
        [4, 5, 6]])

如您所见,numpy.matrix的内容必须是同质的。如果我的初始化中存在字符串值,则每个值都隐式存储为字符串。通过访问单个值

也可以确认这一点
>>> numpy.matrix([[1,2,3],[4,"5",6]])[1,1]
'5'
>>> numpy.matrix([[1,2,3],[4,"5",6]])[1,2]
'6'

现在,Python列表类型可以替代接受混合类型。您可以拥有一个包含整数和字符串的列表,两者都保留其类型。我需要的是类似于列表的东西,但是以类似矩阵的行为操作。

因此,我必须实现自己的类型。我有两个内部实现选择:列表包含列表和字典。这两种解决方案都有缺点:

  • 列表列表需要仔细同步各种列表的大小。交换两行很容易。交换两列不太容易。删除行也很容易。
  • 字典(以元组为键)稍微好一点,但你必须定义键的限制(例如,如果矩阵是3x3,则不能插入元素5,5),并且它们更复杂用于插入,删除或交换列或行。

编辑:澄清。我需要此功能的具体原因是因为我正在阅读CSV文件。一旦我从CSV文件中收集值(可以是字符串,整数,浮点数的值),我想执行交换,删除,插入和其他操作。出于这个原因,我需要一个“矩阵列表”。

我的好奇心是:

  • 你知道提供这项服务的Python数据类型是否已经存在(可能在“非电池包含”库中)?
  • 为什么标准库中没有提供此数据类型?利息太受限制了吗?
  • 你怎么解决这个需求?字典,列表或其他更智能的解决方案?

6 个答案:

答案 0 :(得分:11)

如果dtypeobject

,您可以使用不同类型
In [1]: m = numpy.matrix([[1, 2, 3], [4, '5', 6]], dtype=numpy.object)
In [2]: m
Out[2]: 
matrix([[1, 2, 3],
        [4, 5, 6]], dtype=object)
In [3]: m[1, 1]
Out[3]: '5'
In [4]: m[1, 2]
Out[4]: 6

我不知道除了花哨的索引之外你还有什么好处,因为正如Don指出的那样,你不能用这个矩阵做数学。

答案 1 :(得分:5)

我很好奇为什么你想要这个功能;据我了解,有矩阵(numpy)的原因主要是进行线性数学运算(矩阵变换等)。

我不确定数字定义对于十进制和字符串的乘积是什么。

在内部,您可能希望查看稀疏矩阵实现(http://www.inf.ethz.ch/personal/arbenz/pycon03_contrib.pdf)。有很多方法可以做到这一点(哈希,列表,链表),每个方法都有自己的优点和缺点。如果您的矩阵不会有很多空值或零,那么您可以放弃稀疏实现。

答案 2 :(得分:3)

您是否看过numpy.recarray功能?

例如: http://docs.scipy.org/doc/numpy/reference/generated/numpy.recarray.html

它旨在允许具有混合数据类型的数组。

我不知道数组是否适合您的目的,或者您是否真的需要矩阵 - 我还没有使用numpy矩阵。但是如果数组足够好,重组可能会有效。

答案 3 :(得分:2)

也许这是一个迟到的答案, 但, 为什么不使用pandas

答案 4 :(得分:1)

查看sympy - 它在多态性方面做得相当不错 在它的矩阵中,你可以在sympy.matrices.Matrix上进行操作 col_swap,col_insert,col_del等对象......

In [2]: import sympy as s 
In [6]: import numpy as np

In [11]: npM = np.array([[1,2,3.0], [4,4,"abc"]], dtype=object)
In [12]: npM
Out[12]: 
 [[1 2 3.0]
 [4 4 abc]]

In [14]: type( npM[0][0] )
Out[14]: 
In [15]: type( npM[0][2] )
Out[15]: 
In [16]: type( npM[1][2] )
Out[16]: 


In [17]: M = s.matrices.Matrix(npM)
In [18]: M
Out[18]: 
⎡1  2  3.0⎤
⎢         ⎥
⎣4  4  abc⎦


In [27]: type( M[0,2] )
Out[27]: 
In [28]: type( M[1,2] )
Out[28]: 

In [29]: sym= M[1,2] 
In [32]: print sym.name
abc

In [34]: sym.n
Out[34]: 
In [40]: sym.n(subs={'abc':45} )
Out[40]: 45.0000000000000

答案 5 :(得分:0)

您是否考虑过使用csv文件的csv模块?

Python docs for csv module