我正在寻找一种保留大型numpy数组的快速方法。我想将它们以二进制格式保存到磁盘中,然后相对快速地将它们读回到内存中。不幸的是,cPickle不够快。 我找到了numpy.savez和numpy.load。但是奇怪的是,numpy.load将一个npy文件加载到“内存映射”中。这意味着对数组的常规操作确实很慢。例如,像这样的事情真的很慢: #!/usr/bin/python import numpy as np; import time; from tempfile import TemporaryFile n = 10000000; a = np.arange(n) b = np.arange(n) * 10 c = np.arange(n) * -0.5 file = TemporaryFile() np.savez(file,a = a, b = b, c = c); file.seek(0) t = time.time() z = np.load(file) print "loading …
假设我有一个很大的内存numpy数组,我有一个函数func将这个巨型数组作为输入(以及其他一些参数)。func具有不同参数的参数可以并行运行。例如: def func(arr, param): # do stuff to arr, param # build array arr pool = Pool(processes = 6) results = [pool.apply_async(func, [arr, param]) for param in all_params] output = [res.get() for res in results] 如果我使用多处理库,那么该巨型数组将多次复制到不同的进程中。 有没有办法让不同的进程共享同一数组?该数组对象是只读的,永远不会被修改。 更复杂的是,如果arr不是数组,而是任意python对象,是否可以共享它? [编辑] 我读了答案,但仍然有些困惑。由于fork()是写时复制的,因此在python多处理库中生成新进程时,我们不应调用任何额外的开销。但是下面的代码表明存在巨大的开销: from multiprocessing import Pool, Manager import numpy as np; import …
我有一个numpy数组,其中包含: [1, 2, 3] 我想创建一个包含以下内容的数组: [1, 2, 3, 1] 也就是说,我想将第一个元素添加到数组的末尾。 我尝试了明显的方法: np.concatenate((a, a[0])) 但是我说错了 ValueError: arrays must have same number of dimensions 我不明白这一点-数组都是一维数组。
我最近使用Python 3.5,注意到新的矩阵乘法运算符(@)有时与numpy点运算符的行为有所不同。例如,对于3d阵列: import numpy as np a = np.random.rand(8,13,13) b = np.random.rand(8,13,13) c = a @ b # Python 3.5+ d = np.dot(a, b) 的@运算符返回形状的阵列: c.shape (8, 13, 13) 当np.dot()函数返回时: d.shape (8, 13, 8, 13) 如何用numpy点重现相同的结果?还有其他重大区别吗?