了解列表到列表然后Numpy数组

时间:2013-03-04 17:11:58

标签: python arrays numpy

我想构建一个像:

这样的矩阵
    Col1 Col2 Col3 Coln
row1  1    2    4    2     
row2  3    8    3    3
row3  8    7    7    3
rown  n    n    n    n

我还没有找到python文档中的任何内容,说明如何组合列表列表,是这样的:

a = [[1,2,4,2],[3,8,3,3],[8,7,7,3],[n,n,n,n]]

每一行都是一个列表项,或者每列都是一个列表项:

b = [[1,3,8,n],[2,8,7,n],[4,3,7,n],[2,3,3,n]]

我认为这是一个常见的问题,但我似乎无法找到答案。

基于文档我猜测我可以简单地将其转换为numpy数组:

np.array(a)

有人可以帮忙吗?

4 个答案:

答案 0 :(得分:4)

你想要第一个版本:

a = [[1,2,4,2],[3,8,3,3],[8,7,7,3],[n,n,n,n]]

访问矩阵中的元素时,通常使用matrix[row][col],因此使用上面的Python列表格式a[i]会为您提供行ia[i][j]会给出你是第i行的第j个元素。

要将其转换为numpy数组,np.array(a)是正确的方法。

答案 1 :(得分:1)

此: a = [[1,2,4,2],[3,8,3,3],[8,7,7,3],[n,n,n,n]] 将创建你想要的列表,是的,np.array(a)将它转换为numpy数组。

此外,这是'pythonish'创建一个包含m行和n列的数组(并将所有元素设置为0):

a = [[0 for i in range(n)] for j in range(m)]

答案 2 :(得分:1)

使用第一个约定。如果需要转置:

>>> a = [[1,2,4,2],[3,8,3,3],[8,7,7,3],['n','n','n','n']]
>>> trans=[]
>>> for i in range(len(a)):
...    trans.append([row[i] for row in a])
... 
>>> trans
[[1, 3, 8, 'n'], [2, 8, 7, 'n'], [4, 3, 7, 'n'], [2, 3, 3, 'n']]

然后一个元素是a[row][col] vs trans[col][row](相对于你的示例的a

第一个是Python使用的,很容易看出为什么你应该在布局时使用第一个约定:

a = [[1,2,4,2],
     [3,8,3,3],
     [8,7,7,3],
     ['n','n','n','n']]

当然,当你使用numpy时,使用第一个约定,因为numpy使用了它:

>>> np.array(a)
array([['1', '2', '4', '2'],
       ['3', '8', '3', '3'],
       ['8', '7', '7', '3'],
       ['n', 'n', 'n', 'n']], 
      dtype='|S1')
>>> np.array(trans)
array([['1', '3', '8', 'n'],
       ['2', '8', '7', 'n'],
       ['4', '3', '7', 'n'],
       ['2', '3', '3', 'n']], 
      dtype='|S1')

注意:由于最后一行/ col中的'n',numpy会将整数转换为字符串。

当你真正开始打印该表时,这是一种方式:

def pprint_table(table):
    def format_field(field, fmt='{:,.0f}'):
        if type(field) is str: return field
        if type(field) is tuple: return field[1].format(field[0])
        return fmt.format(field)     

    def get_max_col_w(table, index):
        return max([len(format_field(row[index])) for row in table])         

    col_paddings=[get_max_col_w(table, i) for i in range(len(table[0]))]
    for i,row in enumerate(table):
        # left col
        row_tab=[row[0].ljust(col_paddings[0])]
        # rest of the cols
        row_tab+=[format_field(row[j]).rjust(col_paddings[j]) for j in range(1,len(row))]
        print(' '.join(row_tab))                

pprint_table([
        ['','Col 1', 'Col 2', 'Col 3', 'Col 4'],
        ['row 1', '1','2','4','2'],
        ['row 2','3','8','3','3'],
        ['row 3','8','7','7','3'],
        ['row 4', 'n','n','n','n']]) 

打印:

      Col 1 Col 2 Col 3 Col 4
row 1     1     2     4     2
row 2     3     8     3     3
row 3     8     7     7     3
row 4     n     n     n     n

答案 3 :(得分:1)

既然你提到“矩阵”,我还要补充说你也有np.matrix()选项。

例如:您可以使用

A = [[1,2,3],[4,5,6],[7,8,9]]

创建一个列表(列表),每个内部列表代表一行。

然后

AA = np.array(A)

将创建一个具有矩阵外观的二维数组,但不是矩阵的所有属性。

尽管

AM = np.matrix(A)

将创建一个矩阵。

如果对这两个进行算术运算,那么你会看到差异。例如

AA**2

将对2D数组中的每个元素进行平方。然而

AM**2

将自行执行AM的矩阵乘法。

顺便说一句。上面的用法当然假定“import numpy as np”。