Numpy Routine(s) to create a regular grid inside a 2d array - python
I am trying to write a function that would create a regular grid of 5 pixels by 5 pixels inside a 2d array. I was hoping some combination of numpy.arange and numpy.repeat might do it, but so far I haven't had any luck because numpy.repeat will just repeat along the same row.
Here is an example:
Let's say I want a 5x5 grid inside a 2d array of shape (20, 15). It should look like:
array([[ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2],
[ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2],
[ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2],
[ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2],
[ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2],
[ 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5],
[ 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5],
[ 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5],
[ 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5],
[ 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5],
[ 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8],
[ 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8],
[ 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8],
[ 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8],
[ 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8],
[ 9, 9, 9, 9, 9,10,10,10,10,10,11,11,11,11,11],
[ 9, 9, 9, 9, 9,10,10,10,10,10,11,11,11,11,11],
[ 9, 9, 9, 9, 9,10,10,10,10,10,11,11,11,11,11],
[ 9, 9, 9, 9, 9,10,10,10,10,10,11,11,11,11,11],
[ 9, 9, 9, 9, 9,10,10,10,10,10,11,11,11,11,11]])
I realize I could simply use a loop and slicing to accomplish this, but I could be applying this to very large arrays and I worry that the performance of that would be too slow or impractical.
Can anyone recommend a method to accomplish this?
Thanks in advance.
UPDATE:
All the answers provided seem to work well. Can anyone tell me which will be the most efficient to use for large arrays? By large array I mean it could be 100000 x 100000 or more with 15 x 15 grid cell sizes.
Broadcasting is the answer here:
m, n, d = 20, 15, 5
arr = np.empty((m, n), dtype=np.int)
arr_view = arr.reshape(m // d, d, n // d, d)
vals = np.arange(m // d * n // d).reshape(m // d, 1, n // d, 1)
arr_view[:] = vals
>>> arr
array([[ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2],
[ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2],
[ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2],
[ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2],
[ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2],
[ 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5],
[ 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5],
[ 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5],
[ 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5],
[ 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5],
[ 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8],
[ 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8],
[ 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8],
[ 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8],
[ 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8],
[ 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11],
[ 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11],
[ 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11],
[ 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11],
[ 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11]])
Similar to Jaime's answer:
np.repeat(np.arange(0, 10, 3), 4)[..., None] + np.repeat(np.arange(3), 5)[None, ...]
kron will do this expansion (as Brionius also suggested in the comments):
xi, xj, ni, nj = 5, 5, 4, 3
r = np.kron(np.arange(ni*nj).reshape((ni,nj)), np.ones((xi, xj)))
Although I haven't tested it, I assume it's less efficient than the broadcasting approach, but a bit more concise and easier to understand (I hope). It's likely less efficient because: 1) it requires the array of ones, 2) it does xi*xj multiplications by 1, and 3) it does a bunch of concats.
Related
How to create an array with arrays in one function
I am trying to create an output that will be an array that contains 5 "sub-arrays". Every array should include 10 random numbers between 0 and 10. I have this code: def count_tweets(): big_array = [] for i in range(5): array = [] for p in range(10): array.append(random.randint(0,10)) big_array.append(array) print(big_array) I get a result like: [[4, 2, 7, 1, 3, 2, 6, 9, 3, 10]] [[4, 2, 7, 1, 3, 2, 6, 9, 3, 10], [5, 10, 7, 10, 7, 2, 1, 4, 8, 3]] [[4, 2, 7, 1, 3, 2, 6, 9, 3, 10], [5, 10, 7, 10, 7, 2, 1, 4, 8, 3], [2, 7, 1, 3, 8, 5, 7, 6, 0, 0]] [[4, 2, 7, 1, 3, 2, 6, 9, 3, 10], [5, 10, 7, 10, 7, 2, 1, 4, 8, 3], [2, 7, 1, 3, 8, 5, 7, 6, 0, 0], [0, 1, 9, 9, 4, 2, 10, 4, 3, 8]] [[4, 2, 7, 1, 3, 2, 6, 9, 3, 10], [5, 10, 7, 10, 7, 2, 1, 4, 8, 3], [2, 7, 1, 3, 8, 5, 7, 6, 0, 0], [0, 1, 9, 9, 4, 2, 10, 4, 3, 8], [3, 7, 3, 5, 4, 0, 2, 8, 6, 2]] But instead it should be like: [[0,2,6,7,9,4,6,1,10,5],[1,3,5,9,8,7,6,9,0,10],[3,5,1,7,9,4,7,2,7,9],[10,2,8,5,6,9,2,3,5,9],[4,5,2,9,8,7,5,1,3,5]] I cannot seem to get the indentation correct. How do I fix the code?
So what you did was put the print() statement inside a loop, which will print each time it runs. import random def count_tweets(): big_array = [] for i in range(5): array = [] for p in range(10): array.append(random.randint(0,10)) big_array.append(array) print(big_array) count_tweets() Hope this helps :)
You got it right, just slide the print out of the for loop.(delete four spaces before print())
Python Minizinc gives sometimes a different result than Minizinc IDE
Depending on the input data I sometimes obtain a different result (different objective and solution) when using the Minizinc Python library or the Minizinc IDE. My Python code is the following: from minizinc import Instance, Model, Solver import datetime gecode = Solver.lookup("gecode") model = Model() model.add_file("./model.mzn") model.add_file("./data.dzn", parse_data=True) instance = Instance(gecode, model) TIMELIMIT = datetime.timedelta(seconds=60) result = instance.solve(timeout=TIMELIMIT) print(result.status) result.solution As far as I can tell, my solver parameters are the same in the IDE, I use the same model and same data. I can see the following command in the IDE: Command: minizinc --json-stream --param-file-no-push /private/var/folders/hf/_75w1jh170x75y2_2vwt60lc0000gn/T/mzn_KneEzb.mpc model.mzn data.dzn Configuration: { "intermediate-solutions": true, "solver": "org.gecode.gecode#6.3.0", "time-limit": 60000 } In one specific input data instance, IDE finds an optimal at obj = 80, and Python finds obj = 104. In another instance of input data, both IDE and Python find the same obj. What can explain this different result? Update: I am adding the MiniZinc model and data: model.mzn int: nNodes = nC+2*nV; % ============== Vehicle Routing Problem ============= % include "globals.mzn"; int: nC; int: nV; int: timeBudget; set of int: VEHICLE = 1..nV; set of int: CUSTOMER = 1..nC; set of int: NODES = 1..nNodes; set of int: START_DEPOT_NODES = nC+1..nC+nV; set of int: END_DEPOT_NODES = nC+nV+1..nC+2*nV; set of int: TIME = 0..timeBudget; array[NODES] of int: serviceTime; array[NODES, NODES] of int: distance; % Time windows % departure time must be between TimeWindows[client_i, 1] and TimeWindows[client_i, 2] array[1..nC, 1..2] of int: TimeWindows; % -------- variables ------------- % array[NODES] of var VEHICLE: vehicle; array[NODES] of var NODES: successor; array[NODES] of var TIME: arrivalTime; % -------- Start Nodes, End Nodes constraints ---------- % constraint forall (n in START_DEPOT_NODES) % associate each start ( vehicle[n] = n-nC ); % node with a vehicle constraint forall (n in END_DEPOT_NODES) % associate each end ( vehicle[n] = n-nC-nV ); % node with a vehicle % -------- Successor Nodes constraints ---------- % constraint forall (n in nC+nV+1..nC+2*nV-1) % successors of end nodes ( successor[n] = n-nV+1 ); % are start nodes constraint successor[nC+2*nV] = nC+1; constraint forall (n in START_DEPOT_NODES) % vehicles leave the ( arrivalTime[n] = 0 ); % depot at time zero constraint circuit(successor); % hamiltonian circuit constraint forall (n in CUSTOMER) % use the same vehicle ( vehicle[successor[n]] = vehicle[n] ); % along a subtour constraint forall (n in 1..nC+nV) ( arrivalTime[n] + serviceTime[n] + distance[n,successor[n]] <= arrivalTime[successor[n]] ); % time constraints % -------- Time windows constraints -------------- % constraint forall(i in 1..nC)( TimeWindows[i, 1] <= arrivalTime[i] ); constraint forall(i in 1..nC)( TimeWindows[i, 2] >= arrivalTime[i] ); % -------- objective ------------ % % minimize distance (could be travel time in hours) var int: obj = (sum (n in NODES) (distance[n,successor[n]])); solve minimize obj; % expected overall travel time of each vehicle % -------- output ------------ % output ["obj = \(obj) \n"]; data.dzn nV =5; nC = 40; timeBudget = 5000; serviceTime = [ 6, 7, 3, 10, 2, 5, 2, 9, 7, 6, 5, 7, 7, 9, 9, 3, 7, 9, 1, 2, 5, 4, 7, 6, 3, 4, 6, 6, 2, 1, 10, 1, 5, 4, 10, 2, 10, 9, 2, 10, 5, 6, 4, 9, 9, 10, 6, 6, 6, 5]; distance = [| 0, 3, 7, 2, 10, 1, 6, 1, 10, 7, 3, 9, 5, 10, 5, 6, 2, 4, 3, 6, 5, 4, 4, 8, 7, 8, 8, 7, 8, 8, 9, 5, 2, 2, 9, 1, 2, 3, 1, 6, 6, 1, 1, 5, 3, 1, 5, 1, 4, 9 |5, 0, 7, 7, 6, 9, 1, 2, 2, 7, 10, 1, 9, 7, 5, 9, 4, 9, 8, 8, 4, 2, 10, 6, 1, 2, 7, 7, 4, 6, 5, 7, 9, 1, 10, 8, 6, 9, 1, 8, 6, 10, 7, 5, 7, 4, 10, 6, 8, 2 |7, 7, 0, 8, 10, 10, 6, 5, 9, 7, 5, 3, 2, 8, 10, 6, 10, 9, 8, 2, 1, 9, 10, 7, 4, 6, 1, 5, 8, 8, 9, 1, 2, 2, 6, 3, 2, 7, 1, 3, 6, 9, 7, 3, 6, 6, 6, 3, 3, 8 |7, 3, 6, 0, 10, 5, 8, 2, 5, 7, 1, 10, 8, 2, 5, 6, 9, 7, 1, 2, 1, 3, 3, 10, 10, 3, 9, 7, 2, 3, 4, 10, 10, 7, 6, 4, 9, 9, 8, 4, 1, 5, 6, 3, 10, 4, 5, 9, 3, 7 |5, 4, 9, 4, 0, 9, 8, 1, 1, 4, 9, 2, 10, 4, 4, 9, 7, 6, 8, 10, 5, 5, 5, 7, 8, 10, 10, 7, 3, 1, 6, 2, 4, 6, 5, 3, 10, 1, 2, 7, 3, 1, 2, 8, 1, 5, 10, 1, 5, 5 |2, 4, 4, 4, 7, 0, 8, 9, 3, 2, 8, 7, 7, 7, 5, 9, 9, 8, 3, 2, 3, 8, 3, 2, 8, 4, 1, 6, 4, 3, 2, 3, 6, 4, 2, 10, 6, 5, 5, 5, 10, 6, 4, 10, 10, 10, 8, 3, 2, 4 |5, 3, 6, 3, 7, 1, 0, 9, 10, 5, 4, 10, 4, 8, 9, 8, 6, 4, 1, 9, 2, 1, 4, 4, 6, 6, 9, 1, 9, 1, 7, 2, 1, 5, 4, 3, 6, 4, 4, 10, 4, 10, 7, 10, 4, 7, 8, 1, 3, 4 |9, 1, 5, 4, 6, 5, 10, 0, 4, 8, 10, 7, 5, 10, 7, 5, 4, 4, 10, 7, 8, 6, 2, 7, 9, 6, 2, 3, 9, 8, 3, 9, 4, 6, 5, 1, 4, 6, 7, 6, 9, 1, 9, 5, 5, 5, 5, 6, 7, 1 |5, 6, 4, 2, 9, 1, 5, 4, 0, 3, 3, 3, 6, 1, 4, 10, 1, 10, 10, 4, 8, 4, 7, 2, 9, 4, 4, 4, 4, 10, 8, 9, 9, 7, 9, 3, 9, 9, 3, 7, 1, 9, 2, 1, 3, 9, 8, 4, 1, 8 |10, 5, 8, 5, 7, 2, 1, 1, 5, 0, 7, 2, 5, 10, 5, 7, 1, 7, 7, 8, 3, 1, 3, 3, 9, 10, 1, 7, 1, 3, 4, 1, 8, 8, 4, 4, 5, 3, 3, 2, 3, 9, 4, 2, 3, 8, 5, 7, 9, 9 |9, 5, 8, 1, 2, 3, 1, 5, 10, 4, 0, 8, 10, 9, 3, 5, 1, 2, 10, 4, 9, 2, 1, 1, 10, 1, 4, 7, 7, 8, 10, 2, 6, 7, 8, 7, 4, 3, 5, 7, 7, 8, 10, 2, 3, 4, 7, 6, 6, 7 |8, 10, 3, 2, 9, 4, 2, 3, 7, 4, 8, 0, 9, 5, 1, 6, 7, 7, 9, 5, 4, 2, 3, 8, 7, 1, 2, 10, 9, 5, 4, 4, 4, 9, 3, 4, 9, 9, 6, 9, 6, 10, 9, 3, 8, 3, 9, 3, 6, 2 |1, 1, 6, 3, 6, 1, 9, 3, 9, 2, 6, 1, 0, 5, 10, 5, 1, 7, 7, 5, 3, 1, 7, 3, 7, 3, 5, 10, 1, 8, 3, 6, 2, 6, 2, 1, 2, 5, 8, 8, 10, 4, 6, 1, 10, 2, 3, 3, 1, 1 |3, 5, 3, 4, 7, 7, 10, 9, 5, 3, 5, 3, 8, 0, 5, 6, 5, 9, 8, 8, 4, 1, 6, 8, 5, 9, 7, 5, 7, 5, 5, 1, 3, 6, 7, 9, 9, 10, 2, 3, 2, 6, 8, 9, 10, 3, 2, 1, 4, 5 |6, 5, 6, 8, 6, 5, 2, 9, 5, 3, 10, 8, 4, 6, 0, 10, 2, 2, 3, 3, 7, 5, 5, 9, 4, 2, 10, 10, 4, 4, 2, 3, 4, 8, 10, 6, 1, 1, 1, 9, 8, 1, 9, 5, 6, 9, 7, 5, 7, 8 |6, 9, 8, 1, 8, 10, 7, 1, 4, 2, 8, 1, 4, 3, 2, 0, 3, 7, 4, 9, 5, 2, 10, 2, 8, 9, 3, 3, 2, 8, 9, 4, 1, 10, 2, 10, 9, 6, 10, 2, 9, 9, 9, 2, 4, 8, 7, 9, 9, 5 |8, 3, 4, 5, 5, 5, 4, 6, 6, 2, 6, 6, 5, 3, 4, 6, 0, 7, 1, 7, 1, 8, 5, 10, 8, 8, 9, 6, 10, 3, 10, 6, 4, 6, 8, 9, 9, 9, 1, 7, 3, 5, 4, 7, 3, 7, 2, 10, 10, 7 |10, 7, 1, 4, 7, 6, 2, 5, 1, 9, 7, 9, 6, 9, 6, 2, 3, 0, 5, 4, 3, 4, 2, 5, 5, 1, 1, 1, 1, 10, 4, 5, 6, 2, 2, 7, 10, 9, 4, 3, 4, 3, 9, 2, 6, 10, 9, 6, 4, 2 |2, 10, 10, 8, 5, 4, 4, 2, 1, 7, 7, 9, 2, 2, 7, 1, 7, 4, 0, 9, 5, 3, 10, 4, 10, 9, 7, 3, 4, 1, 8, 6, 1, 8, 2, 6, 1, 1, 6, 7, 3, 3, 10, 1, 10, 5, 3, 1, 5, 9 |8, 4, 2, 6, 5, 5, 6, 2, 1, 3, 10, 10, 10, 4, 3, 3, 1, 4, 6, 0, 6, 4, 3, 10, 4, 5, 3, 10, 1, 6, 6, 8, 4, 8, 4, 7, 4, 5, 9, 1, 3, 6, 1, 5, 10, 3, 10, 7, 7, 5 |3, 9, 8, 5, 2, 7, 9, 9, 10, 4, 9, 10, 10, 2, 8, 2, 9, 2, 2, 8, 0, 2, 5, 3, 9, 10, 9, 8, 2, 2, 5, 4, 7, 6, 5, 7, 6, 1, 4, 10, 6, 4, 4, 8, 4, 5, 4, 3, 10, 5 |4, 2, 5, 7, 7, 5, 9, 8, 2, 9, 5, 6, 5, 4, 4, 1, 1, 5, 8, 8, 4, 0, 2, 10, 8, 6, 8, 8, 3, 8, 2, 4, 6, 7, 1, 4, 1, 1, 6, 3, 3, 10, 9, 7, 1, 8, 10, 4, 1, 7 |1, 10, 1, 5, 4, 8, 8, 5, 5, 9, 7, 9, 1, 8, 4, 7, 8, 3, 5, 6, 2, 4, 0, 1, 10, 3, 10, 7, 8, 4, 10, 4, 10, 1, 10, 5, 1, 9, 8, 5, 6, 7, 6, 7, 9, 10, 9, 5, 8, 2 |7, 1, 8, 8, 9, 4, 9, 10, 1, 5, 6, 8, 8, 10, 9, 7, 10, 5, 3, 4, 10, 6, 5, 0, 6, 2, 6, 8, 2, 5, 5, 3, 4, 7, 6, 6, 2, 1, 1, 7, 8, 7, 9, 3, 6, 5, 2, 10, 2, 4 |3, 6, 6, 8, 9, 8, 4, 9, 2, 4, 3, 5, 8, 4, 1, 4, 9, 9, 3, 8, 2, 5, 10, 2, 0, 4, 5, 8, 5, 7, 5, 4, 4, 5, 1, 5, 2, 3, 2, 8, 4, 6, 9, 3, 8, 4, 1, 7, 5, 8 |9, 2, 7, 6, 1, 4, 9, 2, 5, 7, 2, 5, 2, 5, 5, 3, 6, 4, 8, 4, 8, 6, 10, 1, 6, 0, 6, 4, 3, 3, 4, 3, 7, 3, 3, 7, 8, 10, 7, 1, 2, 5, 4, 5, 8, 4, 7, 7, 2, 9 |2, 10, 9, 3, 1, 9, 7, 10, 8, 5, 10, 8, 4, 6, 9, 2, 3, 9, 4, 10, 9, 8, 7, 4, 6, 8, 0, 8, 7, 2, 2, 9, 7, 6, 9, 4, 3, 8, 4, 2, 8, 1, 1, 9, 4, 10, 2, 8, 8, 2 |1, 4, 4, 8, 8, 8, 3, 6, 7, 8, 1, 2, 10, 2, 2, 5, 4, 4, 8, 8, 2, 8, 5, 5, 2, 9, 9, 0, 4, 6, 10, 8, 3, 5, 2, 8, 4, 7, 2, 3, 4, 6, 3, 9, 6, 3, 8, 10, 3, 2 |9, 10, 1, 9, 8, 9, 6, 3, 3, 8, 9, 8, 7, 6, 6, 7, 10, 8, 5, 6, 6, 4, 2, 6, 9, 2, 10, 10, 0, 5, 9, 4, 3, 10, 9, 8, 3, 1, 5, 8, 1, 9, 7, 5, 4, 6, 10, 10, 7, 2 |9, 4, 6, 2, 2, 2, 2, 6, 6, 5, 5, 1, 6, 5, 6, 4, 7, 6, 4, 9, 2, 10, 9, 10, 2, 4, 1, 9, 1, 0, 5, 9, 3, 8, 10, 7, 4, 3, 10, 1, 8, 1, 7, 10, 5, 6, 1, 10, 10, 3 |4, 10, 3, 7, 3, 7, 2, 9, 10, 2, 2, 4, 3, 9, 5, 5, 9, 8, 3, 5, 2, 9, 7, 1, 4, 6, 2, 5, 4, 6, 0, 6, 1, 4, 5, 10, 8, 3, 2, 8, 7, 6, 10, 2, 5, 1, 7, 4, 10, 3 |6, 8, 3, 6, 2, 3, 5, 1, 10, 6, 8, 4, 6, 5, 7, 1, 6, 7, 1, 3, 7, 6, 10, 5, 5, 5, 10, 7, 2, 10, 9, 0, 1, 9, 2, 2, 8, 3, 6, 7, 3, 10, 5, 5, 7, 4, 6, 7, 7, 10 |3, 1, 5, 9, 6, 8, 5, 8, 4, 9, 3, 3, 6, 6, 7, 6, 1, 8, 7, 10, 2, 2, 8, 7, 4, 6, 3, 2, 6, 3, 4, 9, 0, 2, 7, 2, 7, 3, 3, 4, 3, 9, 3, 2, 4, 10, 1, 7, 2, 7 |10, 10, 4, 3, 5, 1, 7, 10, 6, 3, 5, 10, 3, 9, 7, 2, 5, 10, 4, 3, 10, 1, 7, 9, 1, 1, 5, 4, 3, 3, 7, 2, 5, 0, 10, 10, 1, 9, 2, 3, 6, 6, 7, 1, 9, 6, 5, 1, 1, 10 |5, 8, 7, 3, 2, 1, 5, 1, 1, 4, 9, 4, 6, 3, 9, 10, 1, 3, 4, 1, 9, 2, 10, 6, 10, 7, 6, 6, 10, 7, 5, 3, 2, 8, 0, 3, 3, 5, 8, 5, 2, 6, 2, 10, 5, 4, 3, 7, 1, 7 |10, 7, 7, 3, 7, 3, 2, 3, 2, 5, 7, 8, 1, 8, 10, 1, 1, 2, 7, 2, 6, 10, 9, 7, 10, 1, 7, 8, 9, 5, 3, 1, 10, 3, 5, 0, 6, 3, 5, 9, 4, 7, 3, 7, 7, 7, 1, 6, 9, 5 |8, 7, 8, 7, 10, 1, 3, 5, 4, 1, 8, 10, 8, 1, 7, 5, 1, 8, 5, 9, 3, 10, 9, 4, 7, 4, 2, 9, 1, 5, 8, 6, 8, 10, 1, 7, 0, 8, 8, 8, 1, 1, 3, 1, 1, 4, 9, 3, 8, 6 |10, 4, 1, 4, 3, 8, 1, 10, 3, 9, 4, 3, 5, 10, 5, 10, 10, 2, 6, 10, 10, 1, 1, 4, 7, 7, 2, 1, 4, 8, 2, 9, 4, 7, 1, 7, 6, 0, 7, 10, 2, 1, 8, 5, 2, 7, 6, 7, 1, 9 |10, 6, 5, 8, 7, 6, 9, 5, 6, 8, 9, 9, 9, 1, 3, 4, 7, 9, 5, 7, 6, 1, 1, 5, 1, 1, 5, 10, 3, 6, 9, 3, 4, 4, 9, 10, 9, 1, 0, 10, 7, 5, 4, 10, 8, 6, 2, 10, 4, 5 |5, 9, 1, 7, 9, 9, 5, 9, 5, 4, 10, 5, 8, 2, 7, 1, 5, 8, 4, 7, 1, 7, 7, 5, 2, 4, 9, 5, 7, 5, 8, 4, 1, 7, 7, 8, 4, 7, 4, 0, 4, 1, 2, 1, 5, 7, 9, 1, 10, 2 |9, 5, 7, 7, 6, 7, 10, 7, 1, 3, 2, 8, 4, 1, 8, 2, 6, 2, 10, 3, 5, 10, 6, 4, 10, 7, 7, 5, 10, 2, 10, 6, 1, 7, 10, 9, 2, 8, 3, 5, 0, 3, 10, 4, 4, 9, 9, 5, 10, 6 |8, 9, 3, 5, 10, 8, 3, 9, 1, 10, 1, 9, 7, 7, 3, 1, 10, 9, 1, 3, 5, 10, 2, 8, 10, 5, 4, 10, 9, 4, 7, 5, 2, 7, 10, 1, 8, 5, 1, 4, 4, 0, 2, 4, 6, 4, 8, 10, 9, 3 |5, 2, 1, 2, 9, 8, 8, 5, 4, 8, 1, 2, 3, 9, 2, 5, 9, 5, 6, 9, 1, 3, 2, 4, 1, 9, 4, 6, 1, 5, 9, 6, 1, 6, 8, 8, 8, 6, 7, 9, 8, 7, 0, 10, 8, 3, 3, 4, 2, 10 |1, 4, 8, 7, 8, 10, 4, 7, 7, 4, 2, 1, 3, 4, 1, 3, 5, 10, 3, 5, 10, 6, 5, 7, 10, 3, 6, 2, 5, 2, 8, 7, 2, 10, 4, 7, 7, 7, 5, 4, 9, 2, 5, 0, 3, 1, 3, 7, 3, 6 |6, 10, 4, 6, 7, 8, 1, 4, 9, 10, 5, 1, 3, 7, 5, 5, 1, 9, 2, 1, 8, 8, 3, 1, 6, 2, 9, 6, 9, 9, 8, 3, 8, 2, 5, 8, 3, 9, 3, 4, 10, 10, 7, 3, 0, 9, 6, 5, 3, 4 |4, 1, 1, 4, 8, 2, 3, 5, 4, 4, 5, 2, 6, 6, 2, 4, 2, 10, 9, 7, 3, 6, 9, 6, 10, 10, 8, 1, 10, 8, 5, 3, 8, 10, 3, 9, 8, 3, 8, 10, 4, 9, 2, 5, 3, 0, 5, 9, 5, 4 |2, 9, 7, 10, 9, 1, 2, 9, 3, 8, 1, 4, 4, 10, 9, 1, 4, 4, 2, 8, 1, 9, 9, 7, 8, 7, 5, 2, 1, 6, 10, 5, 1, 8, 10, 1, 4, 4, 7, 1, 7, 3, 3, 7, 4, 10, 0, 1, 2, 5 |5, 9, 4, 6, 5, 5, 7, 5, 9, 5, 5, 9, 8, 2, 5, 5, 2, 9, 7, 4, 5, 5, 8, 5, 2, 1, 2, 7, 7, 2, 9, 10, 4, 2, 9, 6, 9, 4, 8, 4, 10, 8, 2, 9, 10, 10, 9, 0, 3, 5 |3, 10, 8, 7, 5, 5, 9, 2, 5, 8, 3, 8, 1, 1, 7, 4, 8, 3, 1, 4, 7, 4, 3, 9, 1, 8, 5, 9, 9, 7, 2, 6, 6, 10, 1, 6, 7, 3, 8, 1, 6, 10, 10, 1, 1, 5, 8, 2, 0, 2 |6, 6, 8, 8, 8, 10, 8, 10, 8, 3, 4, 5, 8, 4, 10, 6, 8, 10, 2, 8, 10, 7, 10, 3, 9, 9, 5, 9, 5, 8, 8, 10, 1, 1, 8, 4, 2, 2, 9, 10, 4, 5, 4, 1, 4, 5, 3, 3, 2, 0 |]; TimeWindows = [| 7, 504 |10, 582 |6, 552 |3, 531 |8, 538 |7, 520 |7, 514 |7, 585 |10, 599 |5, 585 |1, 549 |7, 531 |3, 526 |1, 553 |8, 562 |3, 575 |6, 534 |1, 574 |5, 554 |6, 577 |7, 532 |6, 605 |9, 531 |8, 509 |9, 529 |2, 532 |2, 559 |4, 584 |6, 535 |8, 574 |9, 580 |7, 571 |7, 511 |7, 596 |5, 607 |4, 536 |5, 593 |1, 575 |2, 565 |9, 525 |];
The key of this seems to be the timeout. With a higher timeout both approaches should always give the same result. But that doesn't really explain why MiniZincIDE and MiniZinc-Python give different results, but it could be just some fluke. I tested the model with the Chuffed solver (+ free search flag) and it took 3.4s: ... ---------- obj = 73 ---------- ========== Google OR-tools took about the same time (with 12 threads it took 0.9s). As mentioned in Placing array of rectangles inside a given area using Minizinc , one might have to experiment with different solvers/search strategies and variants of the model to get faster times. For this model it seems to suffice to simply change the solver (if that is a acceptable action).
Append arrays of different dimensions to get a single array
l have three vectors (numpy arrays), vector_1, vector_2, vector_3 as follow : Dimension(vector1)=(200,2048) Dimension(vector2)=(200,8192) Dimension(vector3)=(200,32768) l would like to append these vectors to get vector_4 : Dimension(vector4)= (200,2048+8192+32768)= (200, 43008) Add respectively vector1 then vector2 then vector3 l tries the following : vector4=numpy.concatenate((vector1,vector2,vector3),axis=0) ValueError: all the input array dimensions except for the concatenation axis must match exactly and vector4=numpy.append(vector4,[vector1,vector2,vectors3],axis=0) TypeError: append() missing 1 required positional argument: 'values'
I believe you are looking for numpy.hstack. >>> import numpy as np >>> a = np.arange(4).reshape(2,2) >>> b = np.arange(6).reshape(2,3) >>> c = np.arange(8).reshape(2,4) >>> a array([[0, 1], [2, 3]]) >>> b array([[0, 1, 2], [3, 4, 5]]) >>> c array([[0, 1, 2, 3], [4, 5, 6, 7]]) >>> np.hstack((a,b,c)) array([[0, 1, 0, 1, 2, 0, 1, 2, 3], [2, 3, 3, 4, 5, 4, 5, 6, 7]])
The error message is pretty much telling you exactly what is the problem: ValueError: all the input array dimensions except for the concatenation axis must match exactly But you are doing the opposite, the concatenation axis dimensions match exactly but the others don't. Consider: In [3]: arr1 = np.random.randint(0,10,(20, 5)) In [4]: arr2 = np.random.randint(0,10,(20, 3)) In [5]: arr3 = np.random.randint(0,10,(20, 11)) Note the dimensions. Just give it the correct axis. So use the second rather than the first: In [8]: arr1.shape, arr2.shape, arr3.shape Out[8]: ((20, 5), (20, 3), (20, 11)) In [9]: np.concatenate((arr1, arr2, arr3), axis=1) Out[9]: array([[3, 1, 4, 7, 3, 6, 1, 1, 6, 7, 4, 6, 8, 6, 2, 8, 2, 5, 0], [4, 2, 2, 1, 7, 8, 0, 7, 2, 2, 3, 9, 8, 0, 7, 3, 5, 9, 6], [2, 8, 9, 8, 5, 3, 5, 8, 5, 2, 4, 1, 2, 0, 3, 2, 9, 1, 0], [6, 7, 3, 5, 6, 8, 3, 8, 4, 8, 1, 5, 4, 4, 6, 4, 0, 3, 4], [3, 5, 8, 8, 7, 7, 4, 8, 7, 3, 8, 7, 0, 2, 8, 9, 1, 9, 0], [5, 4, 8, 3, 7, 8, 3, 2, 7, 8, 2, 4, 8, 0, 6, 9, 2, 0, 3], [0, 0, 1, 8, 6, 4, 4, 4, 2, 8, 4, 1, 4, 1, 3, 1, 5, 5, 1], [1, 6, 3, 3, 9, 2, 3, 4, 9, 2, 6, 1, 4, 1, 5, 6, 0, 1, 9], [4, 5, 4, 7, 1, 4, 0, 8, 8, 1, 6, 0, 4, 6, 3, 1, 2, 5, 2], [6, 4, 3, 2, 9, 4, 1, 7, 7, 0, 0, 5, 9, 3, 7, 4, 5, 6, 1], [7, 7, 0, 4, 1, 9, 9, 1, 0, 1, 8, 3, 6, 0, 5, 1, 4, 0, 7], [7, 9, 0, 4, 0, 5, 5, 9, 8, 9, 9, 7, 8, 8, 2, 6, 2, 3, 1], [4, 1, 6, 5, 4, 5, 6, 7, 9, 2, 5, 8, 6, 6, 6, 8, 2, 3, 1], [7, 7, 8, 5, 0, 8, 5, 6, 4, 4, 3, 5, 9, 8, 7, 9, 8, 8, 1], [3, 9, 3, 6, 3, 2, 2, 4, 0, 1, 0, 4, 3, 0, 1, 3, 4, 1, 3], [5, 1, 9, 7, 1, 8, 3, 9, 4, 7, 6, 7, 4, 7, 0, 1, 2, 8, 7], [6, 3, 8, 0, 6, 2, 1, 8, 1, 0, 0, 3, 7, 2, 1, 5, 7, 0, 7], [5, 4, 7, 5, 5, 8, 3, 2, 6, 1, 0, 4, 6, 9, 7, 3, 9, 2, 5], [1, 4, 8, 5, 7, 2, 0, 2, 6, 2, 6, 5, 5, 4, 6, 1, 8, 8, 1], [4, 4, 5, 6, 2, 6, 0, 5, 1, 8, 4, 5, 8, 9, 2, 1, 0, 4, 2]]) In [10]: np.concatenate((arr1, arr2, arr3), axis=1).shape Out[10]: (20, 19)
Numpy create index/slicing programmatically from array
I can use numpy.mgrid as follows: a = numpy.mgrid[x0:x1, y0:y1] # 2 dimensional b = numpy.mgrid[x0:x1, y0:y1, z0:z1] # 3 dimensional Now, I'd like to create the expression in brackets programmatically, because I do not know whether I have 1, 2, 3 or more dimensions. I'm looking for something like: shape = np.array([[x0, x1], [y0, y1], ... maybe more dimensions ...]) idx = (s[0]:s[1] for s in shape) a = numpy.mgrid[idx] That gives at least a syntax error in the second line. How can I properly generate those indices/slices programmatically? (The mgrid here is rather an example/use case, the question is really about indexing in general.)
Use the slice object. For example: shape = np.array([[0, 10], [0, 10]]) idx = tuple(slice(s[0],s[1], 1) for s in shape) #yields the following #(slice(0, 10, 1), slice(0, 10, 1)) np.mgrid[idx] yields array([[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [2, 2, 2, 2, 2, 2, 2, 2, 2, 2], [3, 3, 3, 3, 3, 3, 3, 3, 3, 3], [4, 4, 4, 4, 4, 4, 4, 4, 4, 4], [5, 5, 5, 5, 5, 5, 5, 5, 5, 5], [6, 6, 6, 6, 6, 6, 6, 6, 6, 6], [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], [8, 8, 8, 8, 8, 8, 8, 8, 8, 8], [9, 9, 9, 9, 9, 9, 9, 9, 9, 9]], [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]]) Alternatively, you could use the Numpy shorthand np.s_, e.g. np.s_[0:10:1], instead of slice(1, 10, 1), but they are equivalent objects.
Combining multiple numpy arrays into one
I have this O/P as shown in the below pic My O/P consists of around 100+ numpy arrays like the one shown above. I'm trying to combine all these 100+ numpy arrays into an single numpy array for further data processing. Any ideas on how to get this done???? I'm using python V3.4
You can use hstack and vstack: In [29]: hstack((arange(10) for _ in range(10))) Out[29]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) In [30]: vstack((arange(10) for _ in range(10))) Out[30]: array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])