2010-03-28 29 views
3

好吧,这可能是一个非常愚蠢的问题,但它真的开始受到伤害。我有一个numpy矩阵,基本上我一行一行地打印出来。但是我想让每一行都格式化并正确分隔。为什么不能用numpy矩阵打印它的行?

>>> arr = numpy.matrix([[x for x in range(5)] for y in range(5)]) 
>>> arr 
matrix([[0, 1, 2, 3, 4], 
     [0, 1, 2, 3, 4], 
     [0, 1, 2, 3, 4], 
     [0, 1, 2, 3, 4], 
     [0, 1, 2, 3, 4]]) 

假设我想打印第一行,然后添加'|'各元素之间:

>>> '|'.join(map(str, arr[0,])) 
'[[0 1 2 3 4]]' 

嗯...

>>> '|'.join(map(lambda x: str(x[0]), arr[0])) 
'[[0 1 2 3 4]]' 

我真的被这种行为感到困惑为什么它这样做呢?

+0

我开始使用适当的大写字母,如“我”的专有名词。也许你可以完成修复你的问题,让其他人阅读。 – 2010-03-28 17:14:41

回答

3

arr返回为一个matrix类型,它可能不是一种迭代的对象,与join很好地发挥。

你可以转换arrlisttolist()然后执行你join

>>> a = arr.tolist() # now you can manipulate the list. 
>>> for i in a: 
'|'.join(map(str,i))  

'0|1|2|3|4' 
'0|1|2|3|4' 
'0|1|2|3|4' 
'0|1|2|3|4' 
'0|1|2|3|4' 

或者使用numpy.asarry为此事

>>> arr = numpy.matrix([[x for x in range(5)] for y in range(5)]) 
>>> ele = numpy.asarray(arr) 
>>> '|'.join(map(str,ele[0,])) 
'0|1|2|3|4' # as per your example. 
0
>>> arr[0,] 
matrix([[0, 1, 2, 3, 4]]) 
>>> len(arr[0,]) 
1 

因此,arr [0,]不是您所期望的列表或一维数组。在另一方面,你的方法适用于从numpy的教程中的例子基质:

>>> def f(x,y): 
...   return 10*x+y 
... 
>>> b = fromfunction(f,(5,4),dtype=int) 
>>> b 
array([[ 0, 1, 2, 3], 
     [10, 11, 12, 13], 
     [20, 21, 22, 23], 
     [30, 31, 32, 33], 
     [40, 41, 42, 43]]) 
>>> len(b[0,]) 
4 
>>> '|'.join(map(str, b[0,])) 
'0|1|2|3' 

我不熟悉numpy的,所以我可以告诉为什么会这样。一个更观察:

>>> type(arr) 
<class 'numpy.matrixlib.defmatrix.matrix'> 
>>> type(b) 
<type 'numpy.ndarray'> 
1

在numpy的一个阵列,矩阵的切片矩阵(注意您的例子双括号[[ ]])。一个简单的方法是使用.A属性获取数组表示。

'|'.join(map(str, arr.A[0,])) 

产生你想要什么:

0|1|2|3|4