繁体   English   中英

python多处理数组

[英]python multiprocessing array

尽管所有看似相似的问题和答案,这里有:

我有一个相当大的2D numpy数组,并希望使用多处理逐行处理它。 对于每一行,我需要找到特定的(数值)值,并使用它们在第二个2D numpy数组中设置值。 一个小例子(真正用于appr.10000x10000单元格的数组):

import numpy as np
inarray = np.array([(1.5,2,3), (4,5.1,6), (2.7, 4.8, 4.3)])
outarray = np.array([(0.0,0.0,0.0), (0.0,0.0,0.0), (0.0,0.0,0.0)])

我现在想要使用多处理逐行处理inarray,以查找inarray中大于5的所有单元格(例如inarray [1,1]和inarray [1,2]),并在outarray中设置具有索引位置的单元格两个维度中较小的一个(例如,outarray [0,0]和outarray [0,1])到1。

看后在这里这里这里我很伤心地说,我仍然不知道该怎么做。 救命!

如果您可以使用最新的numpy开发版本,那么您可以使用多线程而不是多处理。 由于这个PR在几个月前合并,numpy在索引时释放GIL,所以你可以做类似的事情:

import numpy as np
import threading

def target(in_, out):
    out[in_ > .5] = 1

def multi_threaded(a, thread_count=3):
    b = np.zeros_like(a)
    chunk = len(a) // thread_count
    threads = []
    for j in xrange(thread_count):
        sl_a = slice(1 + chunk*j,
                     a.shape[0] if j == thread_count-1 else 1 + chunk*(j+1),
                     None)
        sl_b = slice(sl_a.start-1, sl_a.stop-1, None)
        threads.append(threading.Thread(target=target, args=(a[sl_a, 1:],
                                                             b[sl_b, :-1])))
    for t in threads:
        t.start()
    for t in threads:
        t.join()
    return b

现在做的事情如下:

In [32]: a = np.random.rand(100, 100000)

In [33]: %timeit multi_threaded(a, 1)
1 loops, best of 3: 121 ms per loop

In [34]: %timeit multi_threaded(a, 2)
10 loops, best of 3: 86.6 ms per loop

In [35]: %timeit multi_threaded(a, 3)
10 loops, best of 3: 79.4 ms per loop

我不认为多处理是正确的调用,因为您希望通过多个进程更改一个对象。 我认为这不是一个好主意。 我知道通过多个进程找到索引会很好,但是为了将数据发送到另一个进程,该对象在内部被pickle(再次:据我所知)。

请试试这个并告诉我们它是否很慢:

outarray[inarray[1:,1:] > 5] = 1
outarray

array([[ 1.,  1.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM