如何将数组拆分为大小均匀的卡盘并在每个卡盘上执行相同的计算
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]
我有一个名为 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]