作为一种学习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。
答案 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.array
和numpy.matrix
。然后,简而言之,何时使用
矩阵:基本上,永远不会。 np.matrix
是一个无尽的混乱来源。如果你只能使用python 3.5+,最好使用数组,使用dot
进行矩阵乘法,或使用@
运算符。
数组:提前知道维度和大小(shape
,用numpy说法)时使用它们。
列出:当您需要追加/删除元素时使用列表。
关于如何转换事物:给定一个列表,lst
,np.asarray(lst)
是一个numpy数组。给定一个数组arr
,arr.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
可以改进格式,但这可以提供这个想法。