Read flat list into multidimensional array/matrix in python

后端 未结 4 624
说谎
说谎 2020-12-05 21:25

I have a list of numbers that represent the flattened output of a matrix or array produced by another program, I know the dimensions of the original array and want to read t

相关标签:
4条回答
  • 2020-12-05 21:31

    Without Numpy we can do as below as well..

    l1 = [1,2,3,4,5,6,7,8,9]
    
    def convintomatrix(x):
    
        sqrt = int(len(x) ** 0.5)
        matrix = []
        while x != []:
            matrix.append(x[:sqrt])
            x = x[sqrt:]
        return matrix
    
    print (convintomatrix(l1))
    
    0 讨论(0)
  • 2020-12-05 21:36

    If you dont want to use numpy, there is a simple oneliner for the 2d case:

    group = lambda flat, size: [flat[i:i+size] for i in range(0,len(flat), size)]
    

    And can be generalized for multidimensions by adding recursion:

    import operator
    def shape(flat, dims):
        subdims = dims[1:]
        subsize = reduce(operator.mul, subdims, 1)
        if dims[0]*subsize!=len(flat):
            raise ValueError("Size does not match or invalid")
        if not subdims:
            return flat
        return [shape(flat[i:i+subsize], subdims) for i in range(0,len(flat), subsize)]
    
    0 讨论(0)
  • 2020-12-05 21:45

    For those one liners out there:

    >>> data = [0, 2, 7, 6, 3, 1, 4, 5]
    >>> col = 4  # just grab the number of columns here
    
    >>> [data[i:i+col] for i in range(0, len(data), col)]
    [[0, 2, 7, 6],[3, 1, 4, 5]]
    
    >>> # for pretty print, use either np.array or np.asmatrix
    >>> np.array([data[i:i+col] for i in range(0, len(data), col)]) 
    array([[0, 2, 7, 6],
           [3, 1, 4, 5]])
    
    0 讨论(0)
  • 2020-12-05 21:47

    Use numpy.reshape:

    >>> import numpy as np
    >>> data = np.array( [0, 2, 7, 6, 3, 1, 4, 5] )
    >>> shape = ( 2, 4 )
    >>> data.reshape( shape )
    array([[0, 2, 7, 6],
           [3, 1, 4, 5]])
    

    You can also assign directly to the shape attribute of data if you want to avoid copying it in memory:

    >>> data.shape = shape
    
    0 讨论(0)
提交回复
热议问题