8

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.

jpp
  • 159,742
  • 34
  • 281
  • 339
exsnake
  • 1,767
  • 2
  • 23
  • 44
  • It looks like you are accessing rows. Do you mean columns? – PoDuck Jun 09 '18 at 23:27
  • 1
    You are fetching the rows. It's just that rows of a `np.matrix` are still `np.matrix`, and display as 2d. – hpaulj Jun 09 '18 at 23:43
  • As jpp sayed, you may want to use arrays. But if you insist on using matrices (for the convinience of multiplication, for example) then refer to this post: https://stackoverflow.com/questions/16468717/iterating-over-numpy-matrix-rows-to-apply-a-function-each – yakobyd Jun 10 '18 at 00:23

3 Answers3

14

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.

jpp
  • 159,742
  • 34
  • 281
  • 339
2

Try the following:

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

This gives you each row as a numpy.ndarray.

Kim
  • 4,080
  • 2
  • 30
  • 51
anik120
  • 23
  • 3
2

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]
Community
  • 1
  • 1
kmario23
  • 57,311
  • 13
  • 161
  • 150