dr jerry
dr jerry

Reputation: 10026

how to populate a numpy 2D array with function returning a numpy 1D array

I have function predicton like

def predictions(degree):
  some magic,
  return an np.ndarray([0..100])

I want to call this function for a few values of degree and use it to populate a larger np.ndarray (n=2), filling each row with the outcome of the function predictions. It seems like a simple task but somehow I cant get it working. I tried with

for deg in [1,2,4,8,10]:
   np.append(result, predictions(deg),axis=1)

with result being an np.empty(100). But that failed with Singleton array array(1) cannot be considered a valid collection.

I could not get fromfunction it only works on a coordinate tuple, and the irregular list of degrees is not covered in the docs.

Upvotes: 0

Views: 966

Answers (2)

bobrobbob
bobrobbob

Reputation: 1281

append is in the boring section of numpy. here you know the shape in advance

len_predictions = 100

def predictions(degree):
    return np.ones((len_predictions,))

degrees = [1,2,4,8,10]
result = np.empty((len(degrees), len_predictions))
for i, deg in enumerate(degrees):
    result[i] = predictions(deg)

if you want to store the degree somehow, you can use custom dtypes

Upvotes: 2

hpaulj
hpaulj

Reputation: 231738

Don't use np.ndarray until you are older and wiser! I couldn't even use it without rereading the docs.

arr1d = np.array([1,2,3,4,5])

is the correct way to construct a 1d array from a list of numbers.

Also don't use np.append. I won't even add the 'older and wiser' qualification. It doesn't work in-place; and is slow when used in a loop.

A good way of building a 2 array from 1d arrays is:

alist = []
for i in ....:
    alist.append(<alist or 1d array>)
arr = np.array(alist)

provided all the sublists have the same size, arr should be a 2d array.

This is equivalent to building a 2d array from

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

that is a list of lists.

Or a list comprehension:

np.array([predictions(i) for i in range(10)])

Again, predictions must all return the same length arrays or lists.

Upvotes: 2

Related Questions