VMu
VMu

Reputation: 11

How to create a matrix like below using Numpy

Matrix is like

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

For clarification, it's not just to create one such matrix but many other different matrices like this.

[0, 1, 2, 3]
[1, 2, 3, 4]
[2, 3, 4, 5]

Upvotes: 0

Views: 79

Answers (3)

flawr
flawr

Reputation: 11628

You can easily create a matrix like that using broadcasting, for instance

>>> np.arange(3)[:, None] + np.arange(4)
array([[0, 1, 2, 3],
       [1, 2, 3, 4],
       [2, 3, 4, 5]])

Upvotes: 0

mozway
mozway

Reputation: 260640

You can use a sliding_window_view

from numpy.lib.stride_tricks import sliding_window_view as swv

cols = 4
rows = 3

out = swv(np.arange(cols+rows-1), cols).copy()

NB. because this is a view, you need .copy() to make it a mutable array, it's not necessary if a read-only object is sufficient (e.g., for display or indexing).

Output:

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

Output with cols = 3 ; rows = 5:

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

alternative: broadcasting:

cols = 4
rows = 3

out = np.arange(rows)[:,None] + np.arange(cols)

Output:

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

Upvotes: 2

Andrey
Andrey

Reputation: 60065

L = 3
np.array([
   np.array(range(L)) + j
   for j in range(L)
])

or a bit of optimization:

L = 3
a = np.array(range(L))
np.array([
   a + j
   for j in range(L)
])

Upvotes: 0

Related Questions