如何在for循环中添加计算列来构建numpy矩阵(从头开始,以前不存在)



这是学校里的一项任务(矩阵每列的并行归一化(,除了你可能看到的其他问题外,我发现很难找到像list=[]这样简单的东西,你可以在循环中列出.append((整个列表,而无需预定义维度。以下是我到目前为止对末尾所讨论的行的看法。提前感谢您的帮助!

from multiprocessing import Pool
import numpy as np
def fct_norm(col):
mn = col.min()
mx = col.max()
col_norm = np.zeros((6, 1))
for i in range(6):
col_norm[i, 0] = (col[i] - mn) / (mx - mn)
return col_norm
if __name__ == "__main__":
pool = Pool()
arr = np.random.uniform(0, 100, size=(6, 3))
maybe predefine arr_norm here?
for i in range(2):
print("i = ", i)
col = arr[:, i]
result = pool.map(fct_norm, [col])
norm_arr = HOW_TO_ADD_EACH_RESULT_COLUMN_TO_A_NEW_ARRAY?

连接多个列所需的函数是np.hstack。然而,一个大问题是pool.map在原始代码中没有以正确的方式使用。

正如所写的,不存在列的并行执行,因为每次对pool.map的调用都只得到一列。其想法是同时传递一个具有多个值的迭代器——在本例中,将多个列传递给pool.map

由于numpy在行上循环,而不是在列上循环,因此必须转置矩阵(使用(...).T运算符。此外,在pool完成后,关闭它是一个很好的措施。自动处理此问题的一种方法是使用上下文(即with Pool() as pool:构造,因为它会自动关闭。

所有这些加在一起给出了以下解决方案:

from multiprocessing import Pool
import numpy as np

def fct_norm(col):
mn = col.min()
mx = col.max()
col_norm = np.zeros((6, 1))
for i in range(6):
col_norm[i, 0] = (col[i] - mn) / (mx - mn)
return col_norm

if __name__ == "__main__":
arr = np.random.uniform(0, 100, size=(6, 3))
with Pool() as pool:
norm_arr = np.hstack(pool.map(fct_norm, arr.T))
# Here norm_arr is available for further operations.

因此,整个操作可以在两行中执行。

最新更新