用2d矩阵填充4D矩阵

时间:2018-05-31 16:31:26

标签: python numpy

我想知道是否有一个numpy函数可以让它更快。这是我想要做的一个例子。

def _sparse_4D_rand_mat(self, x, y, density):
    _4D_mat = np.empty((x, y, x, y))
    for i in range(self.size):
        for j in range(self.size):
            _4D_mat[:,i,j,:] = self._rand_sparse(x, y, density)
    return _4D_mat
def _rand_sparse(self, m, n, density, format='csr'):
    nnz = max(min(int(m * n * density), m * n), 0)
    row = np.random.random_integers(low=0, high=m - 1, size=nnz)
    col = np.random.random_integers(low=0, high=n - 1, size=nnz)
    data = np.ones(nnz, dtype=float)
    data = np.random.dirichlet(data)
    return csr_matrix((data, (row, col)), shape=(m, n)).toarray()

感谢您的贡献。 我是新来的;)

1 个答案:

答案 0 :(得分:3)

由于密度保持不变,而不是多次调用_rand_sparse来生成许多小的稀疏2D数组,您可以调用_rand_sparse一次以生成一个大的稀疏2D数组,然后使用{{ 1}}将2D结果重新整形为4D数组的方法:

reshape

例如,

_4D_mat = _rand_sparse(x * y * x, y, density)
_4D_mat = _4D_mat.reshape((x, y, x, y))

由于import numpy as np import scipy.sparse as sparse def _rand_sparse(m, n, density, format='csr'): nnz = max(min(int(m * n * density), m * n), 0) # use randint since random_integer is deprecated in NumPy 1.11.0 row = np.random.randint(low=0, high=m, size=nnz) col = np.random.randint(low=0, high=n, size=nnz) data = np.ones(nnz, dtype=float) data = np.random.dirichlet(data) return sparse.csr_matrix((data, (row, col)), shape=(m, n)).toarray() def orig(x, y, density): _4D_mat = np.empty((x, y, x, y)) for i in range(y): for j in range(x): _4D_mat[:, i, j, :] = _rand_sparse(x, y, density) return _4D_mat def alt(x, y, density): _4D_mat = _rand_sparse(x * y * x, y, density) _4D_mat = _4D_mat.reshape((x, y, x, y)) return _4D_mat x, y, density = 2, 4, 0.5 消除了双重for循环,因此当altorig的值变大时,此解决方案将比x快得多(即,随着for循环中迭代次数的增加)。实际上,即使对于上面使用的小值,y已经比alt快了近8倍:

orig
  

我需要4D阵列中每个2D阵列的总和为1

要规范化您可以使用的相应切片:

In [108]: %timeit orig(x, y, density)
100 loops, best of 3: 2.24 ms per loop

In [109]: %timeit alt(x, y, density)
1000 loops, best of 3: 281 µs per loop