Python如何使用Numpy Matrix得到一个list列表?

使用numpy的dot()函数将1×3的矩阵与3×3的numpy.array相乘。输出是这样的:
[[0.16666667 0.66666667 0.16666667]]
Python中输出的类型如下:

<class 'numpy.matrixlib.defmatrix.matrix'>

那么我们怎么把它转换成一个列表呢?

如果结果是一个1×3的矩阵,所以它应该可以被转换为一个列表,那么我们能够循环来计算两个列表的皮尔逊(Pearson)距离。

需要将行矩阵转换为Python列表,可以尝试下面的几种办法:

方法一:

a = numpy.matrix([[ 0.16666667, 0.66666667, 0.16666667]])
list(numpy.array(a).reshape(-1,))

 

方法二:

numpy.array(a).reshape(-1,).tolist()

 

方法三:

numpy.array(a)[0].tolist()

Code问答: http://codewenda.com/topics/python/

Python列表list.append()随着列表的增长而逐渐变慢如何解决?

Python列表append变慢的问题

问题是这样的:当我们需要读取一个大文件,并需要不断的将读取的内容转为Object存入列表之中。这个时候我们会需要使用list的append方法不断的添加新的元素,然后继续循环。

如果我们的文件有100M,甚至更大,有很多行的数据,那么在append的过程中,这个操作会变的越来越慢。

这样的问题我们应该如何来优化呢?

列表append变慢的原因

首先这种性能的问题,可能是由于使用的Python版本中的垃圾收集器中的错误引起的。升级到Python 2.7或3.1或更高版本以重新获得Python中列表追加的预期的O(1)性能。
另外也可以调整垃圾收集器的触发器,或者随着进度的选择调用collect,但是这样可能会比较复杂。

可以参考参阅:https://bugs.python.org/issue4074https://docs.python.org/release/2.5.2/lib/module-gc.html

我们可以注意到,随着列表长度的增加,将复杂对象(不是数字或字符串的对象)附加到列表中会线性减速。
这种行为的原因是垃圾收集器正在检查并重新检查列表中的每个对象,以查看它们是否有资格进行垃圾回收。此行为导致时间线性增加将对象添加到列表。预计修复程序将在python3中提供。

性能测试

我们其实可以跑一个测试来证明这一点。对于1k次迭代,我将10k对象附加到列表中,并记录每次迭代的运行时间。总的运行时间差异是显而易见的。在测试的内部循环期间禁用垃圾收集,我的系统上的运行时间是18.6s。在整个测试中启用垃圾收集,运行时间是899.4s。

我们来看看具体的测试代码:

import time
import gc

class A:
    def __init__(self):
        self.x = 1
        self.y = 2
        self.why = 'no reason'

def time_to_append(size, append_list, item_gen):
    t0 = time.time()
    for i in xrange(0, size):
        append_list.append(item_gen())
    return time.time() - t0

def test():
    x = []
    count = 10000
    for i in xrange(0,1000):
        print len(x), time_to_append(count, x, lambda: A())

def test_nogc():
    x = []
    count = 10000
    for i in xrange(0,1000):
        gc.disable()
        print len(x), time_to_append(count, x, lambda: A())
        gc.enable()

 

By Code问答