我想构建一个像:
这样的矩阵 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)
有人可以帮忙吗?
答案 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]
会为您提供行i
,a[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”。