np.nanmean的500个大型numpy矩阵

时间:2015-01-18 20:59:27

标签: python numpy matrix

我试图获得非常大的颠簸矩阵的平均值(忽略纳米值)。我知道我可以加载它们而不占用太多内存,做类似的事情:

X=np.load('my_matrix_1.npy', mmap_mode='r')

然后我可以从中读出一些内容。我想从每个矩阵一次读取1000行,并将那些纳米平均值存储在矩阵中,大小为

这样的事情:

for chunk in chunks:
     chunk_to_mean = []
     for matrix in matrices:
          X=np.load(matrix, mmap_mode='r')
          chuck_to_mean.append(X)
          del X
     matrix[chunk] = np.nanmean(chunk_to_mean)

然而,在第二次尝试加载具有内存映射的内容之后,我似乎得到了内存分配错误,即使我删除了它。有谁知道如何解决这个问题,或者更好地了解如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

此代码有几个问题。首先是那个     chunk_to_mean = [] 创建一个数组。但是,你将numpy数组作为元素添加到该数组 - 所以它变成了numpy数组的列表,但是np.nanmean没有数组列表,而是np.array。

第二个是你有一个字典,你可以使用字符串来处理数组,或者你有一个列表,然后你必须使用一个int。所以你的chunk[matrix]没有意义。

所以你有两个选择。如果所有块都具有相同的大小,则可以为每个矩阵取np.nanmean,然后取结果列表的平均值。

results = []
for chunk in chunks:
    chunk_to_mean = []
    for matrix in matrices:
        X=np.load(matrix, mmap_mode='r')
        chuck_to_mean.append(np.nanmean(X))
        del X # why do you need this?? This is python - it has garbage collection!
    results.append(np.nanmean(np.array(chunk_to_mean)))

另一个选项,如果你想要一个加权平均值,就是连接矩阵,然后取np.nanmean:

results = []
for chunk in chunks:
    for i in range(len(matrices)):
        X=np.load(matrix, mmap_mode='r')
        if i==1:
            all_matrices = np.array(X)
        else:
            np.concatenate((all_matrices, np.array(X), axis=0) # check the concat axis!!
        del X
    results.append(np.nanmean(all_matrices))

答案 1 :(得分:0)

这是经过测试和运作的。它应该适用于任何非常大的矩阵,因为它一次只能读取矩阵的一行。只要您可以将平均矩阵保存在内存中,它就会运行。

def average_subject_real(subject):
   matrix = np.load('graph_matrix_%s_1.npy' %(subject), mmap_mode = 'r')
   matrix_size = matrix.shape[0]
   del matrix
   average_matrix = np.zeros((matrix_size,matrix_size))
   for line in range(matrix_size):
       temp_array = []
       for i in range(1,5):
           matrix = np.load('graph_matrix_%s_%s.npy' %(subject,i), mmap_mode = 'r')
           matrix = np.array(matrix[line]) # the copying happens here
        temp_array.append(matrix)
        del matrix
        average_matrix[line] = np.nanmean(temp_array,axis=0)
    np.save('graph_matrix_%s_average.npy' %(subject),arr=average_matrix)