如何将阵列分成均匀尺寸的卡盘,并在每个卡盘上执行相同的计算

时间:2015-05-13 15:24:51

标签: python arrays out-of-memory

我有一个名为start_similarity_results的数组,大小为47000 * 90000,每个元素都是一个0到1之间的浮点数。对于每一行,我需要找出浮点数在哪个位置的col索引大于一个门槛,从所有这些合格的col指数,我会随机挑出一个。现在我的代码看起来像:

    out_start = np.ones(47000)*-1
    cur_row_start = 0
    col_list_start = []
    for r_start, c_start in zip(*(np.nonzero(start_similarity_results>=similarity_threshold))):
        if r_start == cur_row_start:
            col_list_start.append(c_start)
        else:
            random.shuffle(col_list_start)
            if len(col_list_start) != 0:
                out_start[cur_row_start] = col_list_start[0]
            cur_row_start = r_start
            col_list_start = []
            col_list_start.append(c_start)

    random.shuffle(col_list_start)
    if len(col_list_start) != 0:
        out_start[cur_row_start] = col_list_start[0]

所以最后,我可以得到一个名为out_start的数组,大小为47000 * 1,47000是行的行数,对于每一行,都有一个col索引,我将使用此数组进行将来的处理。

但是,当我运行我的代码时,我在

遇到内存错误
for r_start, c_start in zip(*(np.nonzero(start_similarity_results>=similarity_threshold)))    

似乎我的阵列(47000 * 90000)对于处理器来说太大了所以它就停止了。所以我想知道我是否可以将我的阵列分成几个部分并在多核上并行运行它们。重要的是,我将获得与现在相同的out_start

1 个答案:

答案 0 :(得分:1)

首先,多处理或线程不会帮助您解决内存错误。

如果我正确地理解了这个功能,我认为应该解决您的问题。对于每一行,它会获得一个高于阈值的随机列,否则为-1:

import numpy as np
import random

def get_cols(x, thresh):
    out = []
    for row in x:
        above = np.where(row>=thresh)
        if above[0].any():
            out.append(random.choice(above[0]))
        else:
            out.append(-1)
    return np.array(out)

这是您提供的示例输入和输出:

x = np.array([[0.1, 0.2, 0.3, 0.4], [0.2, 0.1, 0.8, 0.02],
              [0.4, 0.4, 0.8, 0.002], [0.5, 0.4, 0.2, 0.6],
              [0.4, 0.8, 0.2, 0.65], [0.1, 0.1, 0.1, 0.1]])

print get_cols(x, 0.3)
# [ 3  2  0  0  0 -1]
# [ 3  2  0  1  0 -1]
# [ 3  2  0  3  0 -1]