Reputation: 12075
I want to be able to 'build' a numpy array on the fly, I do not know the size of this array in advance.
For example I want to do something like this:
a= np.array()
for x in y:
a.append(x)
Which would result in a containing all the elements of x, obviously this is a trivial answer. I am just curious whether this is possible?
Upvotes: 77
Views: 232781
Reputation: 11
list1 = []
size = 1
option = "Y"
for x in range(size):
ele = input("Enter Element For List One : ")
list1.append(ele)
while(option == "Y"):
option = input("\n***Add More Element Press Y ***: ")
if(option=="Y"):
size = size + 1
for x in range(size):
ele = input("Enter Element For List Element : ")
list1.append(ele)
size = 1
else:
break;
print(list1)
Take:
list1 = [] # Store Array Element
size = 1 # Rune at One Time
option = "Y" # Take User Choice
Implementation:
size = 1
size = size + 1
run another for loop at a range of sizeUpvotes: -1
Reputation: 182
I wrote a small utility function. (most answers above are good. I feel this looks nicer)
def np_unknown_cat(acc, arr):
arrE = np.expand_dims(arr, axis=0)
if acc is None:
return arrE
else:
return np.concatenate((acc, arrE))
You can use the above function as the following:
acc = None # accumulator
arr1 = np.ones((3,4))
acc = np_unknown_cat(acc, arr1)
arr2 = np.ones((3,4))
acc = np_unknown_cat(acc, arr2)
Upvotes: 0
Reputation: 34016
Since y is an iterable I really do not see why the calls to append:
a = np.array(list(y))
will do and it's much faster:
import timeit
print timeit.timeit('list(s)', 's=set(x for x in xrange(1000))')
# 23.952975494633154
print timeit.timeit("""li=[]
for x in s: li.append(x)""", 's=set(x for x in xrange(1000))')
# 189.3826994248866
Upvotes: 7
Reputation: 4521
For posterity, I think this is quicker:
a = np.array([np.array(list()) for _ in y])
You might even be able to pass in a generator (i.e. [] -> ()), in which case the inner list is never fully stored in memory.
Responding to comment below:
>>> import numpy as np
>>> y = range(10)
>>> a = np.array([np.array(list) for _ in y])
>>> a
array([array(<type 'list'>, dtype=object),
array(<type 'list'>, dtype=object),
array(<type 'list'>, dtype=object),
array(<type 'list'>, dtype=object),
array(<type 'list'>, dtype=object),
array(<type 'list'>, dtype=object),
array(<type 'list'>, dtype=object),
array(<type 'list'>, dtype=object),
array(<type 'list'>, dtype=object),
array(<type 'list'>, dtype=object)], dtype=object)
Upvotes: 1
Reputation: 363547
Build a Python list and convert that to a Numpy array. That takes amortized O(1) time per append + O(n) for the conversion to array, for a total of O(n).
a = []
for x in y:
a.append(x)
a = np.array(a)
Upvotes: 130
Reputation: 29886
You can do this:
a = np.array([])
for x in y:
a = np.append(a, x)
Upvotes: 19