Chcę utworzyć matrycę numeryczną 6x6, z pierwszym rzędem wypełnionym: 0, 1, ..., 5, drugi wiersz wypełnił 10, 11, ... , 15, a ostatni wiersz wypełniony 50, 51, ... , 55.

Myślałem o przy użyciu komplikacji list listy (1) (1), a następnie przekształcanie listy listy w obiekcie {x0}} lub (2) Korzystanie z zmiennych wewnątrz funkcji range, tj. - range(x) i różnią się x od 1 do 6. Nie byłem w stanie uzyskać żadnego z tych dwóch pomysłów.

Poniżej znajduje się mój nie-wektorowy / zapętlowy kod, aby skonstruować tę matrycę. Czy istnieje bardziej piythic sposób?

a = np.zeros((6,6))
for i in range(6):
    for j in range(6):
        a[i,j] = 10*i + j
print(a)

(Jest to jeden z przykładów podanych na 39:00 w Video Intro do NumPy na YouTube: Intro do obliczeń numerycznych z numpry

2
JZL 21 luty 2019, 01:18

2 odpowiedzi

Najlepsza odpowiedź

Co powiesz na {{x0} }?

np.add(*np.ogrid[:60:10, :6]) 

# array([[ 0,  1,  2,  3,  4,  5],
#        [10, 11, 12, 13, 14, 15],
#        [20, 21, 22, 23, 24, 25],
#        [30, 31, 32, 33, 34, 35],
#        [40, 41, 42, 43, 44, 45],
#        [50, 51, 52, 53, 54, 55]])

szczegóły
ogrid Zwraca otwartą meshgrid:

a, b = np.ogrid[:60:10, :6]
a

# array([[ 0],
#        [10],
#        [20],
#        [30],
#        [40],
#        [50]])

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

Następnie możesz wykonać nadawane dodawanie:

# a + b
np.add(a, b)

# array([[ 0,  1,  2,  3,  4,  5],
#        [10, 11, 12, 13, 14, 15],
#        [20, 21, 22, 23, 24, 25],
#        [30, 31, 32, 33, 34, 35],
#        [40, 41, 42, 43, 44, 45],
#        [50, 51, 52, 53, 54, 55]])

Podobnie można również wygenerować dwa zakresy za pomocą np.arange i dodaj je:

np.arange(0, 60, 10)[:,None] + np.arange(6)

# array([[ 0,  1,  2,  3,  4,  5],
#        [10, 11, 12, 13, 14, 15],
#        [20, 21, 22, 23, 24, 25],
#        [30, 31, 32, 33, 34, 35],
#        [40, 41, 42, 43, 44, 45],
#        [50, 51, 52, 53, 54, 55]])
5
cs95 20 luty 2019, 22:30

Można to osiągnąć z nadawaniem,

arange(0, 6) + 10*arange(0, 6)[:, None]

array([[ 0,  1,  2,  3,  4,  5],
   [10, 11, 12, 13, 14, 15],
   [20, 21, 22, 23, 24, 25],
   [30, 31, 32, 33, 34, 35],
   [40, 41, 42, 43, 44, 45],
   [50, 51, 52, 53, 54, 55]])

Polecam czytanie https://docs.scipy.org/doc /numpy/user/basics.broadcasting.html i HTTPS : //docs.scipy.org/doc/numpy/reference/arrays.indexing.html. "Pythonic" nie ma znaczenia, gdy pracują z Numpy. Niektóre czasy ITERESATE, LIST COMLIMENCJE i inne podejścia do piythonów działają dobrze z tablicami, innymi czasami są strasznie nieefektywne. Jednak linki podawane obejmują pewne koncepcje wysokiego poziomu, które są bardzo potężne z numpry.

3
user2699 20 luty 2019, 22:26