附加列表,数组,矩阵

时间:2016-08-04 20:11:35

标签: python arrays numpy matrix

作为一种学习Python / NumPy的方法,我在20年前的Python 2.7.11中编写了我的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 = [] {type(MSEPCV)}启动, MSEV是从MSE {type(MSE)}和COUNT {type(COUNT)}

创建的

我认为最简单的方法是将所有内容都列入清单并尝试使用tolist(),但是仍然可以使用squackets。

3 个答案:

答案 0 :(得分: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))

答案 1 :(得分:0)

  

我有点(或很多)对如何以及何时使用列表,数组和矩阵以及如何将其转换为另一个感到困惑

由于您标记了numpy,因此我假设您的意思是numpy.arraynumpy.matrix。然后,简而言之,何时使用

  • 矩阵:基本上,永远不会。 np.matrix是一个无尽的混乱来源。如果你只能使用python 3.5+,最好使用数组,使用dot进行矩阵乘法,或使用@运算符。

  • 数组:提前知道维度和大小(shape,用numpy说法)时使用它们。

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

关于如何转换事物:给定一个列表,lstnp.asarray(lst)是一个numpy数组。给定一个数组arrarr.tolist()是一个列表。给定矩阵,np.asarray将其转换为数组,如果矩阵是1乘1,m[0, 0]是标量。

答案 2 :(得分: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表达式从矩阵中提取元素。我也可以像Stuart那样定义一个简单的辅助函数:

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]

现在把它变成一个数组 - 然后用reshape把它变成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.savetxt是编写numpy样式文件的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

糟糕,默认格式为float;将其更改为整数:

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

并查看生成的文件(就像在linux shell中执行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

可以改进格式,但这可以提供这个想法。