The nice thing about array slicing in numpy is you don't need the for loops that you are using. Also the reason that it is only putting the center element is because you only put a single element there (c1[c1mid,c1mid] is a single number) here is what you could do:

    z[7:12,7:12] = c1
    z[7:12,27:32] = c2
    z[26:33,6:14] = c3
    z[25:34,25:33] = c4
Answer from jfish003 on Stack Overflow
Discussions

python - Numpy submatrix operations - Stack Overflow
I'm looking for an efficient way to perform submatrix operations over a larger matrix without resorting to for loops. I'm currently doing the operation (for a 3x3 window): newMatrix = numpy.zeros([numRows, numCols]) for i in range(1, numRows-1): for j in range(1, numCols-1): sub = matrix[i-1:i+2, ... More on stackoverflow.com
🌐 stackoverflow.com
python - Using numpy to Obtain Submatrix - Stack Overflow
I'm trying to do the following with numpy (python newbie here) Create a zeroed matrix of the rigth dimensions num_rows = 80 num_cols = 23 A = numpy.zeros(shape=(num_rows, num_cols)) Operate on the More on stackoverflow.com
🌐 stackoverflow.com
python - How to assign to square submatrices in big matrix without loops in numpy - Stack Overflow
How can I vectorize this loop, which populates two square submatrices of a larger matrix (also keeps larger matrix symmetric) using numpy arrays: for x in range(n): assert m[x].shape == (n,) ... More on stackoverflow.com
🌐 stackoverflow.com
matrix - python: how to create submatrices? Numpy - Stack Overflow
I have a matrix 1500X2, and I have to create 10 submatrices of 150 rows. How can i do this without for loop. I need a function, because with the [:] is too slow and complicated More on stackoverflow.com
🌐 stackoverflow.com
🌐
Stack Overflow
stackoverflow.com › questions › 53433222 › python-how-to-create-submatrices-numpy
matrix - python: how to create submatrices? Numpy - Stack Overflow
I have a matrix 1500X2, and I have to create 10 submatrices of 150 rows. How can i do this without for loop. I need a function, because with the [:] is too slow and complicated ... You could use the numpy.take function to select a range of rows of your matrix.
Find elsewhere
🌐
Stack Overflow
stackoverflow.com › questions › 68112172 › adding-values-from-small-matrix-to-a-specific-place-in-larger-matrix-using-numpy
python - Adding values from small matrix to a specific place in larger matrix using numpy - Stack Overflow
I want to add B to specific indices in A. I want to end up with the ones on row[1], col [1]; row[1] col[3]; row[3] col[1] and row[3] col[3] in A. I have an array with the indices arr = [1,3]. How do I add this matrix B to matrix A given array arr? A = [[0,0,0,0], [0,0,0,0], [0,0,0,0], [0,0,0,0]] B = [[1,1], [1,1]] arr = [1,3] Desired result: A = [[0,0,0,0], [0,1,0,1], [0,0,0,0], [0,1,0,1]] Thankful for any tips! ... Assuming that arr is both rows and columns indices, you need to extract a view on the submatrix containing rows 1 and 3 and columns 1 and 3. Here is the simplest way, using numpy advanced indexing:
🌐
Towards Data Science
towardsdatascience.com › home › latest › two cool features of python numpy: mutating by slicing and broadcasting
Two cool features of Python NumPy: Mutating by slicing and Broadcasting | Towards Data Science
January 16, 2025 - Automatically, the 4×1 vector is duplicated 3 times to match the column dimension of the zero matrix and those values are added to the 4×3 matrix.
Top answer
1 of 2
2

Is n potentially large, so the result is a large sparse matrix with nonzero values concentrated along the diagonal? Sparse matrices are designed with this kind of matrix in mind (from FD and FE PDE problems). I did this a lot in MATLAB, and some with the scipy sparse module.

That module has a block definition mode that might work, but what I'm more familiar with is the coo to csr route.

In the coo format, nonzero elements are defined by 3 vectors, i, j, and data. You can collect all the values for A, B, etc in these arrays (applying the appropriate offset for the values in B etc), without worrying about overlaps. Then when that format is converted to csr (for matrix calculations) the overlapping values are summed - which is exactly what you want.

I think the sparse documentation has some simple examples of this. Conceptually the simplest thing to do is iterate over the n submatrices, and collect the values in those 3 arrays. But I also worked out a more complex system whereby it can be done as one big array operation, or by iterating over a smaller dimension. For example each submatrix has 16 values. In a realistic case 16 will be much smaller than n.

I'd have play around with code to give a more concrete example.

==========================

Here's a simple example with 3 blocks - functional, but not the most efficient

Define 3 blocks:

In [620]: A=np.ones((4,4),int)    
In [621]: B=np.ones((4,4),int)*2
In [622]: C=np.ones((4,4),int)*3

lists to collect values in; could be arrays, but it is easy, and relatively efficient to append or extend lists:

In [623]: i, j, dat = [], [], []

In [629]: def foo(A,n):
   # turn A into a sparse, and add it's points to the arrays
   # with an offset of 'n'
   ac = sparse.coo_matrix(A)
   i.extend(ac.row+n)
   j.extend(ac.col+n)
   dat.extend(ac.data)


In [630]: foo(A,0)

In [631]: i
Out[631]: [0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3]    
In [632]: j
Out[632]: [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3]

In [633]: foo(B,1)
In [634]: foo(C,2)  # do this in a loop in the real world

In [636]: M = sparse.csr_matrix((dat,(i,j)))

In [637]: M
Out[637]: 
<6x6 sparse matrix of type '<class 'numpy.int32'>'
    with 30 stored elements in Compressed Sparse Row format>

In [638]: M.A
Out[638]: 
array([[1, 1, 1, 1, 0, 0],
       [1, 3, 3, 3, 2, 0],
       [1, 3, 6, 6, 5, 3],
       [1, 3, 6, 6, 5, 3],
       [0, 2, 5, 5, 5, 3],
       [0, 0, 3, 3, 3, 3]], dtype=int32)

If I've done this right, overlapping values of A,B,C are summed.

More generally:

In [21]: def foo1(mats):
      i,j,dat = [],[],[]
      for n,mat in enumerate(mats):
          A = sparse.coo_matrix(mat)
          i.extend(A.row+n)
          j.extend(A.col+n)
          dat.extend(A.data)
      M = sparse.csr_matrix((dat,(i,j)))
      return M
   ....:   

In [22]: foo1((A,B,C,B,A)).A
Out[22]: 
array([[1, 1, 1, 1, 0, 0, 0, 0],
       [1, 3, 3, 3, 2, 0, 0, 0],
       [1, 3, 6, 6, 5, 3, 0, 0],
       [1, 3, 6, 8, 7, 5, 2, 0],
       [0, 2, 5, 7, 8, 6, 3, 1],
       [0, 0, 3, 5, 6, 6, 3, 1],
       [0, 0, 0, 2, 3, 3, 3, 1],
       [0, 0, 0, 0, 1, 1, 1, 1]], dtype=int32)

Coming up with a way of doing this more efficiently may depend on how the individual submatrices are generated. If they are created iteratively, you might as well collect the i,j,data values iteratively as well.

==========================

Since the submatrices are dense, we can get the appropriate i,j,data values directly, without going through a coo intermediary. And without looping if the A,B,C are collected into one larger array.

If I modify foo1 to return a coo matrix, I see the i,j,data lists (as arrays) as given, without summation of duplicates. In the example with 5 matrices, I get 80 element arrays, which can be reshaped as

In [110]: f.col.reshape(-1,16)
Out[110]: 
array([[0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3],
       [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4],
       [2, 3, 4, 5, 2, 3, 4, 5, 2, 3, 4, 5, 2, 3, 4, 5],
       [3, 4, 5, 6, 3, 4, 5, 6, 3, 4, 5, 6, 3, 4, 5, 6],
       [4, 5, 6, 7, 4, 5, 6, 7, 4, 5, 6, 7, 4, 5, 6, 7]], dtype=int32)

In [111]: f.row.reshape(-1,16)
Out[111]: 
array([[0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3],
       [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4],
       [2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5],
       [3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6],
       [4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7]], dtype=int32)

In [112]: f.data.reshape(-1,16)
Out[112]: 
array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
       [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
       [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
       [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])

I should be able generate those without a loop, especially the row and col.

In [143]: mats=[A,B,C,B,A]

the coordinates for the elements of an array

In [144]: I,J=[i.ravel() for i in np.mgrid[range(A.shape[0]),range(A.shape[1])]] 

replicate them with offset via broadcasting

In [145]: x=np.arange(len(mats))[:,None]
In [146]: I=I+x    
In [147]: J=J+x

Collect the data into one large array:

In [148]: D=np.concatenate(mats,axis=0)

In [149]: f=sparse.csr_matrix((D.ravel(),(I.ravel(),J.ravel())))

or as a compact function

def foo3(mats):
    A = mats[0]
    n,m = A.shape
    I,J = np.mgrid[range(n), range(m)]
    x = np.arange(len(mats))[:,None]
    I = I.ravel()+x
    J = J.ravel()+x
    D=np.concatenate(mats,axis=0)
    f=sparse.csr_matrix((D.ravel(),(I.ravel(),J.ravel())))
    return f

In this modest example the 2nd version is 2x faster; the first scales linearly with the length of the list; the 2nd is almost independent of its length.

In [158]: timeit foo1(mats)
1000 loops, best of 3: 1.3 ms per loop

In [160]: timeit foo3(mats)
1000 loops, best of 3: 653 µs per loop
2 of 2
0

The simple for-loop way would be to add each 4x4 matrix to an appropriate slice of the big zero matrix:

for i, small_m in enumerate(small_matrices):
    big_m[i:i+4, i:i+4] += small_m

You could also do this with no Python loops by creating a strided view of the zero matrix and using np.add.at for unbuffered addition. This should be particularly efficient if your 4x4 matrices are packed into a k-by-4-by-4 array:

import numpy as np
from numpy.lib.stride_tricks import as_strided

# Create a view of big_m with the shape of small_matrices.
# strided_view[i] is a view of big_m[i:i+4, i:i+4]
strides = (sum(big_m.strides),) + big_m.strides
strided_view = as_strided(big_m, shape=small_matrices.shape, strides=strides)

np.add.at(strided_view, np.arange(small_matrices.shape[0]), small_matrices)
🌐
Reddit
reddit.com › r/learnpython › how to go over submatrices of a matrix - and fast?
r/learnpython on Reddit: How to go over submatrices of a matrix - and fast?
April 7, 2022 -

Hi,

I have an MxN matrix (list of lists), where each element is a tuple of 2 ints.

Given a rectangle size PxQ, where P<=M, Q<=N), I need to find the submatrix inside the MxN matrix which, when calculating the sum of the second element of each tuple inside the rectangle, returns the highest result which is not larger than a number B. Each submatrix is defined by its upper-left corner.

For example, the MxN matrix can be:

[ [(1, 2), (1, 1), (0, 3), (4, 0)],

[(10, 10), (5, 7), (1, 3), (9, 2)],

[(0, 0), (1, 9), (0, 0), (1, 1)] ]

and the rectangle size can be 2x3, so there are 4 submatrices to go over:

[(1, 2), (1, 1), (0, 3)

(10, 10), (5, 7), (1, 3)]

[(1, 1), (0, 3), (4, 0)

(5, 7), (1, 3), (9, 2)]

[(10, 10), (5, 7), (1, 3)

(0, 0), (1, 9), (0, 0)]

[(5, 7), (1, 3), (9, 2)

(1, 9), (0, 0), (1, 1)]

If B=27, the correct submatrix, in this case, is the second one, since it has the highest sum of 2nd elements, which is 2+1+3+10+7+3=26, which is smaller than B. The third submatrix yields a larger sum (29) but 29 > 27 so it is not the right answer.

I'm looking for an efficient way to go over the submatrices and determine if the sum of the 2nd elements is the largest. Is there a faster way than using for loops?

Top answer
1 of 5
5
First, I suggest a slight change of representation. Instead of a MxN matrix of tuples, you can have a 2xMxN matrix of integers. This is beneficial as you can then take the second index of the first dimension, and not have to deal with tuple indexing. If you already have your matrix of tuples you can convert it trivially: >>> a = [[( 1, 2), (1, 1), (0, 3), (4, 0)], >>> [ (10, 10), (5, 7), (1, 3), (9, 2)], >>> [ ( 0, 0), (1, 9), (0, 0), (1, 1)]] >>> a = np.moveaxis(np.array(a), -1, 0) # 2x3x4 matrix >>> a[1] [[ 2 1 3 0] [10 7 3 2] [ 0 9 0 1]] Now the problem is reduced to finding the "largest-sum PxQ submatrix smaller than B" of a[1]. So, how do we solve it optimally? No clue, but I came up with a simple method using a 2D cumulative sum, that I believe should be O(NxM) (correct me if I'm mistaken). [Complete runnable example]
2 of 5
3
So if I understand your problem correctly, you have your MxN matrix. Your challenge is to find a subgrid (PxQ) such that the sum of all second values is as close to (but not exceeding) the value B. With regards to matrix calculations in Python, if you want speed, you want NumPy. It gives you fixed-size arrays with certain functionality implemented efficiently behind the scenes (e.g. summation of values - do you see how this could be useful?). It also allows you to perform indexing in multiple dimensions. See below for an example >>> import numpy as np >>> matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) >>> print(matrix) array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) >>> array[:2, :2] array([[1, 2], [4, 5]]) >>> matrix[1:3, 1:3] array([[5, 6], [8, 9]]) >>> print(matrix.sum()) 45 Hopefully the above shows how you could go about performing your task. One thing to note: NumPy arrays shouldn't contain Python objects - instead I'd probably split your tuples into two separate numpy arrays (you could make it a 3d numpy array but that's probably overcomplicating)
🌐
Stack Overflow
stackoverflow.com › questions › 65011037 › adding-a-submatrix-at-a-certain-location-rounds-down-all-entries-in-the-submatri
numpy - Adding a submatrix at a certain location rounds down all entries in the submatrix (python) - Stack Overflow
If you assign float values to a int dtype array, the values are truncated to integers. ... I figured it out. If the original values of A are all int, the matrix is an int matrix. I therefor added the line A = A.astype(np.float32), which fixed the problem.
🌐
NumPy
numpy.org › doc › 2.1 › reference › generated › numpy.matrix.html
numpy.matrix — NumPy v2.1 Manual
Returns the transpose of the matrix. ... Base object if memory is from some other object. ... An object to simplify the interaction of the array with the ctypes module.
🌐
GeeksforGeeks
geeksforgeeks.org › python › adding-and-subtracting-matrices-in-python
Adding and Subtracting Matrices in Python - GeeksforGeeks
September 22, 2025 - NumPy provides the np.add() function, which adds two matrices element-wise. ... import numpy as np A = np.array([[1, 2], [3, 4]]) B = np.array([[4, 5], [6, 7]]) print("Matrix A:\n", A) print("Matrix B:\n", B) # Adding matrices C = np.add(A, ...
🌐
IncludeHelp
includehelp.com › python › how-to-replace-sub-part-of-matrix-by-another-small-matrix-in-numpy.aspx
Python - How to replace sub part of matrix by another small matrix in NumPy?
Replacing sub part of matrix by another small matrix can be simply done using the indexing, we just need to select the piece of the matrix that we need to replace which must be of the same shape as the small matrix, and assign this piece of the matrix as the small matrix.
🌐
Stack Overflow
stackoverflow.com › questions › 38688745 › the-efficient-approach-to-generate-submatrices
python - the efficient approach to generate submatrices - Stack Overflow
The following is a function that can return sub-matries from two given matries. The position of generating these sub-matries are the same for both input matries. The input matries are of Numpy arra...