2010-03-28 56 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