我试图获得非常大的颠簸矩阵的平均值(忽略纳米值)。我知道我可以加载它们而不占用太多内存,做类似的事情:
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)
然而,在第二次尝试加载具有内存映射的内容之后,我似乎得到了内存分配错误,即使我删除了它。有谁知道如何解决这个问题,或者更好地了解如何解决这个问题?
答案 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)