I am trying to convert a list into a numpy array with a specified number of columns. I can get the code to work outside the function as follows:
import numpy as np
ls = np.linspace(1,100,100) # Data Sample
ls = np.array(ls) # list --> array
# resize | outside function
ls.resize(ls.shape[0]//2,2)
print(ls)
>> [[ 1. 2.]
[ 3. 4.]
.
.
.
[ 97. 98.]
[ 99. 100.]]
I do not understand my error when trying to throw the routine in a function. My attempt is as follows:
# resize | inside function
def shapeshift(mylist, num_col):
num_col = int(num_col)
return mylist.resize(mylist.shape[0]//num_col,num_col)
ls = shapeshift(ls,2)
print(ls)
>> None
I want to define the original function in this way because I want another function, consisting of the same inputs and a third input to loop over rows when extracting values, to call this original function for each loop over rows.
No need to wrap again in
array
; it already is one:resize
operates in-place. It returns nothing (or None)With this
resize
you aren't changing the number of elements, soreshape
would work just as well.reshape
in either method or function form returns a value, leavingls
unchanged. The-1
is a handy short hand, avoiding the//
division.This is the inplace version of reshape:
reshape
requires the same total number of elements.resize
allows you to change the number of elements, truncating or repeating values if needed. We usereshape
much more often thenresize
.repeat
andtile
are also more common thanresize
.The
.resize
method works in-place and returnsNone
. It also refuses to work at all if there are other names referencing the same array. You can use the function form, which creates a new array and is not as capricious: