I have a function that does the following:
- Takes uses the list as an input
- Computes the sum of the list
- Appends the output (the sum) to the input list
- Runs itself again (this time with a list of N 1 data).
I want to to do this exact thing for an input of a numpy array, but I don't get a complete solution.
This is what I currently have:
data = [15.5, 19.2, 27.8, 44.6, 71.0, 54.1, 60.2]
def AppendOutput(data, steps):
for i in range(steps):
s = sum(data)
emp.append(s)
data.append(emp)
return data
s = AppendOutput(data, 3)
This outputs the following, which is what I want:
[15.5, 19.2, 27.8, 44.6, 71.0, 54.1, 60.2, 292.4, 584.8, 1169.6]
My current issue is that I'm trying to accomplish the same thing for an input that is a numpy array.
data_array = np.array([data])
def AppendOutputNP(data, steps):
for j in range(steps):
temp = np.sum(data_array).reshape((-1,1))
new = np.append(data_array, temp, axis=1)
return new
AppendOutputNP(data_array, 3)
I get a partial solution in comparison to what I would get for the original function; this time only one element gets appended instead of three:
array([[ 15.5, 19.2, 27.8, 44.6, 71. , 54.1, 60.2, 292.4]])
Could anyone direct me as to what I'm doing wrong here?
CodePudding user response:
It's probably best to form the result array at the start of the function. numpy.append
is quite slow.
def AppendSumNP(data, steps, dtype = np.float64 ):
result = np.zeros( len(data) steps, dtype = dtype )
# The result array is big enough for the whole result
result[ :len(data) ] = data
for j in range( len(data), len(data) steps ):
result[ j ] = result[:j].sum()
return result
Also the second sum is twice the first and the third twice the second, etc. so only sum once, then multiply.
def AppendMultNP(data, steps, dtype = np.float64 ):
result = np.zeros( len(data) steps, dtype = dtype )
result[ :len(data)] = data
total = result[:len(data)].sum()
for j in range( len(data), len(data) steps ):
result[ j ] = total
total *= 2
return result
It depends how long the data list is but the Mult
approach can be several times as fast.