Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Iterate over a numpy Matrix rows

First, I tried to find an answer to my question ( which I think is pretty basic) searching in google and in the site, but nothing came up.

I'm trying to get the rows from a numpy matrix, but I can't. For example if I use this:

result = numpy.matrix([[11, 12, 13],
                       [21, 22, 23],
                       [31, 32, 33]])

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

prints this:

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

The same if I use just p

What I have to do to access every row? numpy.nditer(result) prints an array, and I need every row to perform some operations.

like image 741
exsnake Avatar asked Jun 09 '18 23:06

exsnake


3 Answers

The problem is you are using np.matrix. Use np.array instead and simply iterate without indexing:

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]

Explanation

What you are seeing is the effect of numpy.matrix requiring each row to have 2 dimensions. This is unnecessary and anti-pattern for NumPy.

There is a history behind numpy.matrix. It was used initial for convenience of matrix multiplication operators. But this is no longer an issue since @ is possible (Python 3.5+) instead of nested dot calls. Therefore, by default, use numpy.array.

like image 82
jpp Avatar answered Oct 03 '22 23:10

jpp


There are two ways (both essentially boils down to same logic)

method-1:

Use result.A

Return self as an ndarray object.
Equivalent to np.asarray(self).

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

method-2:

Use result.getA()

Return self as an ndarray object.
Equivalent to np.asarray(self).

In [17]: for row in result.getA():
    ...:     print(row)
    ...:     
[11 12 13]
[21 22 23]
[31 32 33]
like image 24
kmario23 Avatar answered Oct 04 '22 00:10

kmario23


Try the following:

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

This gives you each row as a numpy.ndarray.

like image 20
anik120 Avatar answered Oct 03 '22 22:10

anik120