昨天我需要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数据类型是否已经存在(可能在"非电池包含"库中)?
为什么标准库中没有提供此数据类型?利息太受限制了吗?
你怎么解决这个需求?字典,列表或其他更智能的解决方案?
Autoplectic.. 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指出的那样,你不能用这个矩阵做数学.
如果你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指出的那样,你不能用这个矩阵做数学.
我很好奇你为什么要这个功能; 据我所知,有矩阵(numpy)的原因主要是进行线性数学运算(矩阵变换等).
我不确定数字定义对于十进制和字符串的乘积是什么.
在内部,您可能希望查看稀疏矩阵实现(http://www.inf.ethz.ch/personal/arbenz/pycon03_contrib.pdf).有很多方法可以做到这一点(哈希,列表,链表),每个方法都有自己的优点和缺点.如果您的矩阵不会有很多空值或零,那么您可以放弃稀疏实现.