昨天我需要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]])
Run Code Online (Sandbox Code Playgroud)
如您所见,numpy.matrix内容必须是同质的.如果我的初始化中存在字符串值,则每个值都隐式存储为字符串.访问单个值也可以确认这一点
>>> numpy.matrix([[1,2,3],[4,"5",6]])[1,1]
'5'
>>> numpy.matrix([[1,2,3],[4,"5",6]])[1,2]
'6'
Run Code Online (Sandbox Code Playgroud)
现在,Python列表类型可以替代接受混合类型.您可以拥有一个包含整数和字符串的列表,两者都保留其类型.我需要的是类似于列表的东西,但是以类似矩阵的行为操作.
因此,我必须实现自己的类型.我有两个内部实现选择:列表包含列表和字典.两种解决方案都有缺点:
编辑:澄清.我需要此功能的具体原因是因为我正在阅读CSV文件.一旦我从CSV文件中收集值(可以是字符串,整数,浮点数的值),我想执行交换,删除,插入和其他操作.出于这个原因,我需要一个"矩阵列表".
我的好奇心是:
Aut*_*tic 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
Run Code Online (Sandbox Code Playgroud)
除了花哨的索引之外,我不知道你有什么好处,因为正如Don指出的那样,你不能用这个矩阵做数学.
我很好奇你为什么要这个功能; 据我所知,有矩阵(numpy)的原因主要是进行线性数学运算(矩阵变换等).
我不确定数字定义对于十进制和字符串的乘积是什么.
在内部,您可能希望查看稀疏矩阵实现(http://www.inf.ethz.ch/personal/arbenz/pycon03_contrib.pdf).有很多方法可以做到这一点(哈希,列表,链表),每个方法都有自己的优点和缺点.如果您的矩阵不会有很多空值或零,那么您可以放弃稀疏实现.