FraserOfSmeg
FraserOfSmeg

Reputation: 1148

Visualising a numpy array/matrix

I have a function that returns a list. I think I use np.append to add this list as a new line in an array, my intention is as follow:

list = 4 5 6

b = 1 2 3
b = np.append(b, list)

output;

1 2 3
4 5 6

This isn't the code I use (there's a lot of messing around in between). But the output I get is this:

2016-06-01  PRINT [  99.86         99.928        99.9          99.875        99.8          89.7933
   97.60018333   98.903        99.928         0.2801201    98.95         98.93
   98.87         98.94         99.05         89.097        97.6712       98.87
   99.59          0.23538903   99.711        99.732        99.725        99.724
   99.769        89.777        98.12053333   99.68         99.88
    0.30333219   99.805        99.79         99.743        99.71         99.69
   89.7728       98.06653333   99.617        99.82          0.28981292
   99.882        99.879        99.865        99.84         99.9          89.9206
   98.29823333   99.82        100.08          0.31420778]

Is this a 10 column by 5 row array/matrix or is this a 50 column/row array? I feel like I'm missing something here - or is it just that the output doesn't really show the shape of the array?

Upvotes: 2

Views: 146

Answers (2)

hpaulj
hpaulj

Reputation: 231738

True list append:

In [701]: alist = [4,5,6]
In [702]: b=[1,2,3]
In [703]: b.append(alist)
In [704]: b
Out[704]: [1, 2, 3, [4, 5, 6]]

bad array operation:

In [705]: anArray=np.array([4,5,6])
In [706]: b=np.array([1,2,3])
In [707]: b=np.append(b,anArray)
In [708]: b
Out[708]: array([1, 2, 3, 4, 5, 6])
In [709]: b.shape
Out[709]: (6,)

Here I just concatenated anArray onto b, making a longer array.

I've said this before - np.append is not a good function. It looks too much like the list append, and people end up misusing it. Either they miss the fact that it returns a new array, as opposed to modifying in-place. Or they use it repeatedly.

Here's the preferred way of collecting lists or arrays and joining them into one

In [710]: alist = []
In [711]: b=np.array([1,2,3])  # could be b=[1,2,3]
In [712]: alist.append(b)
In [713]: b=np.array([4,5,6])   # b=[4,5,6]
In [714]: alist.append(b)
In [715]: alist
Out[715]: [array([1, 2, 3]), array([4, 5, 6])]
In [716]: np.array(alist)
Out[716]: 
array([[1, 2, 3],
       [4, 5, 6]])
In [717]: _.shape
Out[717]: (2, 3)

The result is a 2d array. List append is much faster than array append (which is real array concatenate). Build the list and then make the array.

The most common way of defining a 2d array is with a list of lists:

In [718]: np.array([[1,2,3],[4,5,6]])
Out[718]: 
array([[1, 2, 3],
       [4, 5, 6]])

np.concatenate is another option for joining arrays and lists. If gives more control over how they are joined, but you have to pay attention to the dimensions of the inputs (you should pay attention to those anyways).

There are several 'stack' functions which streamline the dimension handling a bit, stack, hstack, vstack and yes, append. It's worth looking at their code.

Upvotes: 3

karakfa
karakfa

Reputation: 67567

you should use hstack or vstack

import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
np.vstack((a,b))

gives

array([[1, 2, 3],
       [4, 5, 6]])

or

np.hstack((a,b))

gives

array([1, 2, 3, 4, 5, 6])

Upvotes: 1

Related Questions