为什么numpy矩阵不让我打印它的行?

时间:2010-03-28 05:36:08

标签: python 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]]'

我对此行为感到困惑,为什么会这样做?

3 个答案:

答案 0 :(得分:3)

arr作为matrix类型返回,该类型可能不是与join很好地匹配的可迭代对象。

您可以使用tolist()arr转换为list,然后然后执行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.

答案 1 :(得分:1)

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

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

产生你想要的东西:

0|1|2|3|4

答案 2 :(得分:0)

>>> arr[0,]
matrix([[0, 1, 2, 3, 4]])
>>> len(arr[0,])
1

所以arr [0,]不是你想象的列表或1-d数组。另一方面,您的方法适用于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'>