3

我想构造一个矩阵,如:

    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

4 回答 4

4

你想要第一个版本:

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

当访问矩阵中的元素时,您通常使用matrix[row][col], 因此使用上述 Python 列表格式a[i]将为您提供 row i,并a[i][j]为您提供第 i 行中的第 j 个元素。

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

于 2013-03-04T17:15:37.543 回答
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)]

于 2013-03-04T17:14:53.860 回答
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')

注意:numpy 将整数转换为字符串,因为'n'在最后一行/列中。

当您实际开始打印该表时,这是一种方法:

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
于 2013-03-04T17:21:39.520 回答
1

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

例如:您可以使用

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

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

然后

AA = np.array(A)

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

然而

AM = np.matrix(A)

将创建一个矩阵。

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

AA**2

将平方二维数组中的每个元素。然而

AM**2

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

顺便提一句。上述用法当然假设“将 numpy 导入为 np”。

于 2013-03-04T17:28:17.680 回答