昨天我需要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列表类型可以替代接受混合类型。您可以拥有一个包含整数和字符串的列表,两者都保留其类型。我需要的是类似于列表的东西,但是以类似矩阵的行为操作。
因此,我必须实现自己的类型。我有两个内部实现选择:列表包含列表和字典。这两种解决方案都有缺点:
编辑:澄清。我需要此功能的具体原因是因为我正在阅读CSV文件。一旦我从CSV文件中收集值(可以是字符串,整数,浮点数的值),我想执行交换,删除,插入和其他操作。出于这个原因,我需要一个“矩阵列表”。
我的好奇心是:
答案 0 :(得分:11)
如果dtype
为object
:
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模块?