Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

I have variable 'x_data' sized 360x190, I am trying to select particular rows of data.

 x_data_train = []
 x_data_train = np.append([x_data_train,
                           x_data[0:20,:],
                           x_data[46:65,:],
                           x_data[91:110,:],
                           x_data[136:155,:],
                           x_data[181:200,:],
                           x_data[226:245,:],
                           x_data[271:290,:],
                           x_data[316:335,:]],axis = 0)

I get the following error : TypeError: append() missing 1 required positional argument: 'values'

where did I go wrong ?

If I am using

x_data_train = []
x_data_train.append(x_data[0:20,:])
x_data_train.append(x_data[46:65,:])
x_data_train.append(x_data[91:110,:])
x_data_train.append(x_data[136:155,:])
x_data_train.append(x_data[181:200,:])
x_data_train.append(x_data[226:245,:])
x_data_train.append(x_data[271:290,:])
x_data_train.append(x_data[316:335,:])

the size of the output is 8 instead of 160 rows.

Update:

In matlab, I will load the text file and x_data will be variable having 360 rows and 190 columns. If I want to select 1 to 20 , 46 to 65, ... rows of data , I simply give x_data_train = xdata([1:20,46:65,91:110,136:155,181:200,226:245,271:290,316:335], :); the resulting x_data_train will be the array of my desired.

How can do that in python because it results array of 8 subsets of array for 20*192 each, but I want it to be one array 160*192

From review: Raady, if you are the same person as RDK, it makes sense to join your SO accounts so you could edit your own posts without being stuck for review. – SergGr Mar 3, 2017 at 22:10 RDK account is mine and I didnt knew I have edited from that account, I will update. I didnt knew that we can merge accounts. – Raady Mar 4, 2017 at 2:05 It is not a fully automatic process but still it can be done. See stackoverflow.com/help/merging-accounts – SergGr Mar 4, 2017 at 7:16

Short version: the most idiomatic and fastest way to do what you want in python is this (assuming x_data is a numpy array):

x_data_train = np.vstack([x_data[0:20,:],
                          x_data[46:65,:],
                          x_data[91:110,:],
                          x_data[136:155,:],
                          x_data[181:200,:],
                          x_data[226:245,:],
                          x_data[271:290,:],
                          x_data[316:335,:]])

This can be shortened (but made very slightly slower) by doing:

xdata[np.r_[0:20,46:65,91:110,136:155,181:200,226:245,271:290,316:335], :]

For your case where you have a lot of indices I think it helps readability, but in cases where there are fewer indices I would use the first approach.

Long version:

There are several different issues at play here.

First, in python, [] makes a list, not an array like in MATLAB. Lists are more like 1D cell arrays. They can hold any data type, including other lists, but they cannot have multiple dimensions. The equivalent of MATLAB matrices in Python are numpy arrays, which are created using np.array.

Second, [x, y] in Python always creates a list where the first element is x and the second element is y. In MATLAB [x, y] can do one of several completely different things depending on what x and y are. In your case, you want to concatenate. In Python, you need to explicitly concatenate. For two lists, there are several ways to do that. The simplest is using x += y, which modifies x in-place by putting the contents of y at the end. You can combine multiple lists by doing something like x += y + z + w. If you want to keep x, unchanged, you can assign to a new variable using something like z = x + y. Finally, you can use x.extend(y), which is roughly equivalent to x += y but works with some data types besides lists.

For numpy arrays, you need to use a slightly different approach. While Python lists can be modified in-place, strictly speaking neither MATLAB matrices nor numpy arrays can be. MATLAB pretends to allow this, but it is really creating a new matrix behind-the-scenes (which is why you get a warning if you try to resize a matrix in a loop). Numpy requires you to be more explicit about creating a new array. The simplest approach is to use np.hstack, which concatenates two arrays horizontally (or np.vstack or np.dstack for vertical and depth concatenation, respectively). So you could do z = np.hstack([v, w, x, y]). There is an append method and function in numpy, but it almost never works in practice so don't use it (it requires careful memory management that is more trouble than it is worth).

Third, what append does is to create one new element in the target list, and put whatever variable append is called with in that element. So if you do x.append([1,2,3]), it adds one new element to the end of list x containing the list [1,2,3]. It would be more like x = [x, {{1,2,3}}}, where x is a cell array.

Fourth, Python makes heavy use of "methods", which are basically functions attached to data (it is a bit more complicated than that in practice, but those complexities aren't really relevant here). Recent versions of MATLAB has added them as well, but they aren't really integrated into MATLAB data types like they are in Python. So where in MATLAB you would usually use sum(x), for numpy arrays you would use x.sum(). In this case, assuming you were doing appending (which you aren't) you wouldn't use the np.append(x, y), you would use x.append(y).

Finally, in MATLAB x:y creates a matrix of values from x to y. In Python, however, it creates a "slice", which doesn't actually contain all the values and so can be processed much more quickly by lists and numpy arrays. However, you can't really work with multiple slices like you do in your example (nor does it make sense to because slices in numpy don't make copies like they do in MATLAB, while using multiple indexes does make a copy). You can get something close to what you have in MATLAB using np.r_, which creates a numpy array based on indexes and slices. So to reproduce your example in numpy, where xdata is a numpy array, you can do xdata[np.r_[1:20,46:65,91:110,136:155,181:200,226:245,271:290,316:335], :]

More information on x_data and np might be needed to solve this but...

First: You're creating 2 copies of the same list: np and x_data_train Second: Your indexes on x_data are strange Third: You're passing 3 objects to append() when it only accepts 2.

I'm pretty sure revisiting your indexes on x_data will be where you solve the current error, but it will result in another error related to passing 2 values to append.

And I'm also sure you want

    x_data_train.append(object) 
    x_data_train = np.append(object)

and you may actually want

    x_data_train.extend([objects])

More on append vs extend here: append vs. extend

extend is making 8 sub arrays but I need a merged ones. I made an update hope you can better understand the problem. – Raady Mar 4, 2017 at 3:24

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.