在numpy矩阵中迭代行

9
首先,我试着在谷歌和网站上搜索我的问题(我认为这很基础),但是没有找到任何答案。 我想获取一个numpy矩阵的行,但是我无法做到。例如,如果我使用以下代码:
result = numpy.matrix([[11, 12, 13],
                       [21, 22, 23],
                       [31, 32, 33]])

for p in result:
    print(p[0])

打印出这个结果:

[[11 12 13]]
[[21 22 23]]
[[31 32 33]]

如果我只使用 p,结果会相同。

我需要怎样才能访问每一行?numpy.nditer(result) 打印出一个数组,而我需要每一行来执行一些操作。


看起来你正在访问行。你是不是想访问列? - PoDuck
1
您正在获取行。只不过,np.matrix的行仍然是np.matrix,并显示为2D。 - hpaulj
正如jpp所说,您可能想使用数组。但是如果您坚持使用矩阵(例如为了方便乘法),那么请参考此帖子:https://dev59.com/8WQn5IYBdhLWcg3w7KrS - yakobyd
3个回答

15
问题在于你正在使用 np.matrix。请改用np.array,并简单地进行迭代而不索引:
result = np.array([[11, 12, 13],
                   [21, 22, 23],
                   [31, 32, 33]])

for p in result:
    print(p)

[11 12 13]
[21 22 23]
[31 32 33]

解释

你所看到的是 numpy.matrix 要求每个 都必须有2个维度的影响。这在NumPy中是不必要的反模式。

numpy.matrix 背后有一个历史,它最初是为方便矩阵乘法操作符而使用的。但是这已经不再是问题,因为可以使用@(Python 3.5+)代替嵌套的dot调用。因此,默认情况下,请使用numpy.array


2

请尝试以下方法:

for p in result:
    print(numpy.array(p)[0])

这将会把每一行转换成一个numpy.ndarray

2

有两种方法(本质上都归结为相同的逻辑)

方法一:

使用result.A

self作为ndarray对象返回。
等价于np.asarray(self)

In [16]: for row in result.A:
    ...:     print(row)
    ...:     
[11 12 13]
[21 22 23]
[31 32 33]

方法二:

使用result.getA()

self返回为一个ndarray对象。
相当于np.asarray(self)

In [17]: for row in result.getA():
    ...:     print(row)
    ...:     
[11 12 13]
[21 22 23]
[31 32 33]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接