202

I am using numpy. I have a matrix with 1 column and N rows and I want to get an array from with N elements.

For example, if i have M = matrix([[1], [2], [3], [4]]), I want to get A = array([1,2,3,4]).

To achieve it, I use A = np.array(M.T)[0]. Does anyone know a more elegant way to get the same result?

Thanks!

1

10 Answers 10

244

If you'd like something a bit more readable, you can do this:

A = np.squeeze(np.asarray(M))

Equivalently, you could also do: A = np.asarray(M).reshape(-1), but that's a bit less easy to read.

Sign up to request clarification or add additional context in comments.

6 Comments

Little rant on my part...why does numpy have arrays and matrices as separate entities. It is so unpythonic IMHO. Thanks for this tip @Joe.
@Naijaba - For what it's worth, the matrix class is effectively (but not formally) depreciated. It's there mostly for historical purposes. Removing numpy.matrix is a bit of a contentious issue, but the numpy devs very much agree with you that having both is unpythonic and annoying for a whole host of reasons. However, the amount of old, unmaintained code "in the wild" that uses matrix makes it difficult to fully remove it.
Not to mention, true matrix multiplication was only added for arrays in Numpy 1.10, and is basically still in beta. This means that a lot of people (including myself) still have to use matrices instead of arrays to get done what we want done. docs.scipy.org/doc/numpy/reference/generated/numpy.matmul.html
Sparse matrices are fundamental for memory-efficient machine learning (e.g., sklearn). In fact there are different sparse matrix types in scipy, which allow efficient access via rows or columns. I imagine this may be an issue for merging the concepts of matrix and array. That said, I'm wondering whether there could be introduced a sparse array type as well and whether there are any plans for doing that. Any clues?
I think .flatten() works as well as .squeeze(), as long as you want a 1D array in the end.
|
153
result = M.A1

https://numpy.org/doc/stable/reference/generated/numpy.matrix.A1.html

matrix.A1
1-d base array

2 Comments

I think this answer is better than the accepted answer, performance-wise, and simplicity
M.A1 is great, same implementation as "ravel" and "flatten" and in this case doesn't cause any data copy A thus remains linked to M which can cause surprises if A and/or M are mutable. M.flat genuine alternative returning "flatiter" generator (read-only semantics) np.squeeze(M) # gives a view removing dimensions of size 1, ok here too but not guaranteed to be 1-d for general M np.reshape(M,-1) # is usually a view depending on shape compatibility, this "-1" is a roundabout way to do A1/ravel/flatten
14

You can try the following variant:

result=np.array(M).flatten()

Comments

13
A, = np.array(M.T)

depends what you mean by elegance i suppose but thats what i would do

Comments

9
np.array(M).ravel()

If you care for speed; But if you care for memory:

np.asarray(M).ravel()

1 Comment

It would improve the quality of your answer if you explained why
7

Or you could try to avoid some temps with

A = M.view(np.ndarray)
A.shape = -1

Comments

2

First, Mv = numpy.asarray(M.T), which gives you a 4x1 but 2D array.

Then, perform A = Mv[0,:], which gives you what you want. You could put them together, as numpy.asarray(M.T)[0,:].

Comments

2

This will convert the matrix into array

A = np.ravel(M).T

Comments

2

ravel() and flatten() functions from numpy are two techniques that I would try here. I will like to add to the posts made by Joe, Siraj, bubble and Kevad.

Ravel:

A = M.ravel()
print A, A.shape
>>> [1 2 3 4] (4,)

Flatten:

M = np.array([[1], [2], [3], [4]])
A = M.flatten()
print A, A.shape
>>> [1 2 3 4] (4,)

numpy.ravel() is faster, since it is a library level function which does not make any copy of the array. However, any change in array A will carry itself over to the original array M if you are using numpy.ravel().

numpy.flatten() is slower than numpy.ravel(). But if you are using numpy.flatten() to create A, then changes in A will not get carried over to the original array M.

numpy.squeeze() and M.reshape(-1) are slower than numpy.flatten() and numpy.ravel().

%timeit M.ravel()
>>> 1000000 loops, best of 3: 309 ns per loop

%timeit M.flatten()
>>> 1000000 loops, best of 3: 650 ns per loop

%timeit M.reshape(-1)
>>> 1000000 loops, best of 3: 755 ns per loop

%timeit np.squeeze(M)
>>> 1000000 loops, best of 3: 886 ns per loop

Comments

-1

Came in a little late, hope this helps someone,

np.array(M.flat)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.