2016-08-04 57 views
1

作为一种学习Python/NumPy的方法,我正在用Python 2.7.11编写20年前我的SAS IML论文。该方法涉及在外部循环内部具有多个循环的蒙特卡洛模拟。我用一个简单的例子取得了成功。我处于需要从每次迭代中累积统计数据的地步,而且我需要指导,因为我对如何以及何时使用列表,数组和矩阵以及如何将其转换为其他尽管反复寻找文件和例子。追加列表,数组,矩阵

如果我打印报告,我希望有一个表看起来像这样(分隔符可以是空格)

MSEa  Ca MSEb  Cb 
1421 7 1184  3 
925  2 1077 4 

,所以我可以选择在每个MSE列最小的MSE和C配对。

我有什么是

MSEV 
[matrix([[ 1421]]), 7, matrix([[ 1184]]), 3, matrix([[ 925]]), 2, matrix([[ 1077]]), 4] 
type(MSEPCV) 
<type 'list'> 

MSE是从矩阵数学一个标量, MSEV被启动作为MSEV = [] {式(MSEPCV)},是从MSE {类型创建 MSEV(MSE) }和COUNT {类型(COUNT)}

我认为最简单的做法是将所有东西都做成列表并尝试使用tolist(),但是仍然存在紧身裤。

+0

列表* *有方括号'[]' - 这就是列表。我并不完全确定你需要矩阵,但我不熟悉你的问题空间 –

+0

可能最好不要使用混合数组和矩阵,因为它们有不同的语义。 – karakfa

回答

1

你不知何故结束了一个包含单元素矩阵和普通数字混合的列表。如果不能避免这种情况,那么你可以经常清理名单使用类似下面的打印:以标准方式

def extract_number(x): 
    try: 
     return x.item(0) # returns first item in x, if x is a matrix 
    except AttributeError: 
     return x   # if x is not a matrix or array, just return x 

print([extract_number(x) for x in MSEV]) 

这将输出列表的Python显示列表

[1421, 7, 1184, 3, 925, 2, 1077, 4] 

要显示更漂亮,你可以看看字符串格式化,做这样的事情:

print("""MSEa  Ca MSEb  Cb 
{:4}{:6}{:6}{:7} 
{:4}{:6}{:6}{:7}""".format(*msev)) 
0

我有点(或很多)混淆有关如何以及何时使用列表,数组和矩阵以及如何将一个转换为其他

既然你标记它numpy,我会假设你的意思numpy.arraynumpy.matrix。那么,总之,何时使用

  • 矩阵:基本上,从来没有。 np.matrix是一个混乱的源泉。如果您只能使用python 3.5+,那么最好使用数组,使用dot进行矩阵乘法,或使用@运算符。

  • 数组:在事先知道尺寸和大小(shape,用numpy的说法)时使用它们。

  • 列表:当您需要追加/删除元素时使用列表。

至于如何转换的事情:给定一个列表,lstnp.asarray(lst)是numpy的阵列。给定一个数组,arr,arr.tolist()是一个列表。给定一个矩阵,np.asarray将它转换成一个数组,如果矩阵是1×1,m[0, 0]是一个标量。

0

我不确定你的matrix来自哪里,以及为什么矩阵和数字的组合,但我会尝试处理它。

为了便于复制粘贴,我将定义matrix(我已将numpy加载为np)。我在一家IPython的会话工作:

In [373]: matrix=np.matrix 

In [375]: alist=[matrix([[ 1421]]), 7, matrix([[ 1184]]), 3, matrix([[ 925]]), 2, matrix([[ 1077]]), 4] 

In [376]: alist 
Out[376]: 
[matrix([[1421]]), 
7, 
matrix([[1184]]), 
3, 
matrix([[925]]), 
2, 
matrix([[1077]]), 
4] 

我会通过与ifelse表达,它可以提取矩阵元素列表理解运行它。我也可以这样来定义一个简单的辅助功能斯图尔特那样:

In [379]: newlist=[x[0,0] if isinstance(x,np.matrix) else x for x in alist] 
In [380]: newlist 
Out[380]: [1421, 7, 1184, 3, 925, 2, 1077, 4] 

现在把它变成一个数组 - 并使用重塑,使其2行。

In [381]: Marray=np.array(newlist).reshape(2,-1) 
In [382]: Marray 
Out[382]: 
array([[1421, 7, 1184, 3], 
     [ 925, 2, 1077, 4]]) 

np.savetxtnumpy函数写csv样式文件:

In [386]: np.savetxt('test.txt',Marray) 
In [387]: cat test.txt 
1.421000000000000000e+03 7.000000000000000000e+00 1.184000000000000000e+03 3.000000000000000000e+00 
9.250000000000000000e+02 2.000000000000000000e+00 1.077000000000000000e+03 4.000000000000000000e+00 

哎呀,默认格式为浮动;改变为整数:

In [388]: np.savetxt('test.txt',Marray, '%d') 

,并期待在生成的文件(就像在Linux壳做cat

In [389]: cat test.txt 
1421 7 1184 3 
925 2 1077 4 

并用标题行:

In [392]: np.savetxt('test.txt',Marray, '%d',header='MSEa Ca MSEb Cb') 

In [393]: cat test.txt 
# MSEa Ca MSEb Cb 
1421 7 1184 3 
925 2 1077 4 

格式可以被提炼,但是那给了想法。