如何将数组拆分为大小均匀的卡盘并在每个卡盘上执行相同的计算

How to split an array into evenly sized chucks and perform the same calculation on each chuck

我有一个名为 start_similarity_results 的数组,大小为 47000*90000,每个元素都是一个介于 0 和 1 之间的浮点数。对于每一行,我需要找出浮点所在位置的 col 索引number 大于一个阈值,并且从所有这些合格的 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:

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]