为什么numpy矩阵无法打印其行?

3 投票
3 回答
2857 浏览
提问于 2025-04-15 20:56

好吧,这可能是个很傻的问题,不过我真的快受不了了。我有一个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
>>> 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
3

arr 是以 matrix 类型返回的,这种类型可能不是一个可以顺利使用 join 的可迭代对象。

你可以先把 arr 转换成一个 list,使用 tolist() 方法,然后再进行 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.asarray 来处理这个数组。

>>> 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.

撰写回答