如何提高使用迭代器中的数据加载ndarray的效率?

我有一个迭代器,其中包含13,104,640个三元组(i,j,value)i是行的索引,而j是矩阵的列的索引。我还声明了一个带有所有项目的2D ndarray。当我使用for循环将2d ndarray加载到迭代器中的项目时,时间消耗非常高。

如何提高该迭代器项加载2d ndarray的效率?

下面是我的python3代码补丁:

nn = 5120
prxy_matrix = np.ones((nn,nn),dtype=float)
for i,p in iterator_A:
    prxy_matrix[i][j] = p
    prxy_matrix[j][i] = p

我可以使用某些矩阵操作,例如将数据作为某些块移动吗?

williamlee3399 回答:如何提高使用迭代器中的数据加载ndarray的效率?

在生成完整的上下三角形并可以控制元素的顺序时,最简单的方法是odd_square()scipy.spatial.distance.squareform期望值逐行,与您从squareform获得的顺序相同。

从迭代器中获取数据的最快方法是itertools.combinations

np.fromiter

模拟数据源:

import numpy as np
from operator import itemgetter
from scipy.spatial.distance import squareform
import itertools as it

原始代码:

def source(n):
    for i,j in it.combinations(range(n),2):
        yield i,j,(i-j)/2

我的建议:

def OP():
    prxy_matrix = np.ones((nn,nn),dtype=float)
    for i,p in source(nn):
        prxy_matrix[i][j] = p
        prxy_matrix[j][i] = p
    return prxy_matrix

这已经快了很多,但是我们浪费了创建和丢弃元组的时间(坐标是多余的,所以我们甚至不读取它们)。 您似乎可以控制生成器,请考虑只生成数据:

def pp():
    data = np.fromiter(map(itemgetter(2),source(nn)),float,(nn*(nn-1))//2)
    prxy_matrix = squareform(data)
    prxy_matrix.ravel()[::nn+1] = 1
    return prxy_matrix

一些时间:

def val_only(n):
    for i,2):
        yield (i-j)/2

def pp2():
    data = np.fromiter(val_only(nn),(nn*(nn-1))//2)
    prxy_matrix = squareform(data)
    prxy_matrix.ravel()[::nn+1] = 1
    return prxy_matrix

产量:

from timeit import timeit

nn = 1000
print(timeit(OP,number=10))
print(timeit(pp,number=10))
print(timeit(pp2,number=10))
# next three are to give a rough idea how much of the time is due to the iterator alone
print(timeit(lambda:all(source(nn)),number=10))
print(timeit(lambda:sum(val_only(nn)),number=10))
print(timeit(lambda:sum(it.chain.from_iterable(source(nn))),number=10))
本文链接:https://www.f2er.com/3162798.html

大家都在问