Strona 1 z 1

[Python][NumPy] Macierze

: 16 lis 2021, o 21:47
autor: xdominika
Witam wszystkich. Mam pewien problem, mianowicie muszę stworzyć, korzystając z modułu random, trzy wektory o tej samej długości. Z tym nie mam problemu, ale potem mam zamieścić je w jednej trójwymiarowej macierzy, a następnie rozpoznać, na której osi są umieszczone dane wektory. W jaki sposób można to rozpoznać?

Re: Python - macierze - NumPy

: 18 lis 2021, o 17:42
autor: Ponury123
Jeśli długość wektorów jest inna niż 3 to łatwo, w przeciwnym razie nie mam pomysłu jak to sprawdzić. Jakby to był secure random to można by coś kombinować czy dany układ jest wystarczająco silny, ale z zwykłym random brak pomysłów.

Re: Python - macierze - NumPy

: 21 lis 2021, o 08:05
autor: kubadt
Według mnie zadanie nie ma większego sensu. Do tego, aby umieścić wektory w macierzy użyjemy jednej z metod:
- hstack
- vstack
- append

Bez względu na to, której metody użyjemy podczas umieszczania wektorów wewnątrz tej macierzy definiujemy na której z osi mają one się znaleźć. Jeżeli już koniecznie chcemy programowo ustalić która z osi zawiera te wektory możemy posłużyć się atrybutem shape. Atrybut shape ma strukturę krotki składającej się z rozmiarów poszczególnych osi macierzy. Korzystając z operacji modulo możemy łatwo ustalić, która z metod została użyta.

Re: Python - macierze - NumPy

: 21 lis 2021, o 19:00
autor: Ponury123
kubadt pisze: 21 lis 2021, o 08:05 Atrybut shape ma strukturę krotki składającej się z rozmiarów poszczególnych osi macierzy.
A masz jakiś pomysł jak to ustalić kiedy osie są równe? Trzy wektory o długości 3.

Re: Python - macierze - NumPy

: 24 lis 2021, o 13:46
autor: kubadt
Ponury123 pisze: 21 lis 2021, o 19:00
kubadt pisze: 21 lis 2021, o 08:05 Atrybut shape ma strukturę krotki składającej się z rozmiarów poszczególnych osi macierzy.
A masz jakiś pomysł jak to ustalić kiedy osie są równe? Trzy wektory o długości 3.
Tak. Otóż, jeżeli wszystkie wektory znajdują się na osi 1, krotka shape będzie miała wartość (1,9). W przypadku, gdy będą one wpisane na osi 0, krotka będzie miała wartość (3,3). Można popełnić błąd myślowy, polegający na pomyleniu osi "macierzy" (a tak naprawdę tensora rzędu 2), z transpozycją tej "macierzy". Wektory nigdy nie zostaną wpisane jako transponowane, o ile tej transpozycji bezpośrednio nie wyrazimy. Poniżej kilka przykładów.

Kod: Zaznacz cały

import numpy as np

v1 = np.random.random(3)
v2 = np.random.random(3)
v3 = np.random.random(3)

m1 = np.array([[v1],[v2],[v3]]) #wektory na osi 0, tensor 3 rzędu
m2 = np.array([v1,v2,v3]) #wektory na osi 0, tensor 2 rzędu ("macierz")
m3 = np.vstack([v1,np.vstack([v2,v3])]) #wektory na osi 0, tensor 2 rzędu ("macierz")
m4 = np.hstack([v1,np.hstack([v2,v3])]) #wektory na osi 0, tensor 1 rzędu ("wektor")
m5 = np.append(np.array([v1]),np.append(np.array([v2]),np.array([v3]), axis = 1), axis = 1) #wektory na osi 1, tensor 2 rzędu ("macierz")
m6 = np.append(np.array([v1]),np.append(np.array([v2]),np.array([v3]), axis = 0), axis = 0) #wektory na osi 0, tensor 2 rzędu ("macierz")

print(m1.shape)
print(m1)
print(m2.shape)
print(m2)
print(m3.shape)
print(m3)
print(m4.shape)
print(m4)
print(m5.shape)
print(m5)
print(m6.shape)
print(m6)
output

Kod: Zaznacz cały

(3, 1, 3)
[[[0.18355889 0.36373735 0.92515974]]

 [[0.63372584 0.95619418 0.81640724]]

 [[0.88232588 0.76941389 0.612795  ]]]
(3, 3)
[[0.18355889 0.36373735 0.92515974]
 [0.63372584 0.95619418 0.81640724]
 [0.88232588 0.76941389 0.612795  ]]
(3, 3)
[[0.18355889 0.36373735 0.92515974]
 [0.63372584 0.95619418 0.81640724]
 [0.88232588 0.76941389 0.612795  ]]
(9,)
[0.18355889 0.36373735 0.92515974 0.63372584 0.95619418 0.81640724
 0.88232588 0.76941389 0.612795  ]
(1, 9)
[[0.18355889 0.36373735 0.92515974 0.63372584 0.95619418 0.81640724
  0.88232588 0.76941389 0.612795  ]]
(3, 3)
[[0.18355889 0.36373735 0.92515974]
 [0.63372584 0.95619418 0.81640724]
 [0.88232588 0.76941389 0.612795  ]]

Re: Python - macierze - NumPy

: 26 lis 2021, o 13:43
autor: Ponury123
Trochę inaczej zrozumiałem treść zadania, ale nie znam się na pythonie więc kłócił się nie będę, fajnie, że to rozpisałeś, dziękuję za Twój czas ;)