Zmień formularz tablicy obrazu


Mam 60 000 obrazów train_images wprowadzonych jako macierz formularzy (28,28,60000). To jest numpy.ndarray. Chcę przekonwertować go na tablicę obrazów 1D, to znaczy każdy obraz jest reprezentowany jako pojedynczy ciąg/tablica liczb, a chcę 60 000 tablic. Innymi słowy, chcę przejść od (28, 28, 60 000) do (60 000, 28 * 28). w Pythonie byłoby to:
images_features = []
for image in images:
imageLine = []
for y in range(len(image)):
for x in range(len(image[0])):
imageLine.append(image[y][x])
images_features.append(imageLine)

W jaki sposób mogę to zrobić? Podejrzewam, że muszę użyć zmiany kształtu, ale nie mogłem dokładnie wymyślić, jak mogę to zrobić.
Oto jak otrzymuję obrazy:
data = scipy.io.loadmat('train.mat')
images = data["train_images"]

Więc „obrazy” to tablica, o której mówię.
Ktoś mi powiedział, że:
„Być może będziesz musiał zmienić osie lub połączyć je, aby uzyskać żądaną funkcjonalność. Polecam również ich zbudowanie na wypadek, gdyby obraz skończył się bokiem. Upewnij się, że pilnie obchodzisz się z osiami, aby uniknąć dalszych problemów”.
Nie mam pojęcia, o co w tym chodzi i jak to uwzględnić.

Czy ktoś może wyjaśnić, co muszę zrobić i dlaczego? (Co on robi

)
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Ponieważ dzieje się to poprzez
loadmat
, forma
(28,28,60000)
ma sens - MATLAB powtarza się, zaczynając od ostatniego indeksu.
images.transpose() # or images.T

zmienia kolejność osi, tak aby wynik był
(60000,28,28)
. Ostatnie dwa wymiary można łączyć z przekształcaniem
images.T.reshape(60000,28*28)
images.T.reshape(60000,-1) # short hand

Musisz bardzo transponować obrazy 28x28, takie jak
images.transpose([2,0,1]) # instead of the default [2,1,0]

.T
to to samo co MATLAB
'
(lub
.'
).
images
może mieć również postać
order = 'F'
.
octave:38> images=reshape(1:30,2,3,5);
octave:39> save test.mat -v7 images
octave:40> images
images =ans(:,:,1) = 1 3 5
2 4 6ans(:,:,2) = 7 9 11
8 10 12....

Wybrałem wymiary testowe, aby były małe i aby łatwo odróżnić różne osie.
W sesji Ipython:
In [15]: data=io.loadmat('test.mat')In [16]: data
Out[16]:
{'__globals__': [],
'__header__': 'MATLAB 5.0 MAT-file, written by Octave 3.8.2, 2016-02-10 05:19:18 UTC',
'__version__': '1.0',
'images': array([[[ 1., 7., 13., 19., 25.],
[ 3., 9., 15., 21., 27.],
[ 5., 11., 17., 23., 29.]], [[ 2., 8., 14., 20., 26.],
[ 4., 10., 16., 22., 28.],
[ 6., 12., 18., 24., 30.]]])}In [18]: data['images'].T
Out[18]:
array([[[ 1., 2.],
[ 3., 4.],
[ 5., 6.]], [[ 7., 8.],
[ 9., 10.],
[ 11., 12.]],....
In [19]: data['images'].transpose([2,0,1])
Out[19]:
array([[[ 1., 3., 5.],
[ 2., 4., 6.]], [[ 7., 9., 11.],
[ 8., 10., 12.]],
....
In [22]: data['images'].transpose([2,1,0]).reshape(5,-1)
Out[22]:
array([[ 1., 2., 3., 4., 5., 6.],
[ 7., 8., 9., 10., 11., 12.],
...
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Myślę, że wystarczy użyć zmiany kształtu:
>>> images = np.ndarray([60000, 28, 28])
>>> images.shape
(60000, 28, 28)
>>> images_rs = images.reshape([60000, 28*28])
>>> images_rs.shape
(60000, 784)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz zmienić kształt
train_images
i przetestować go, rysując wykresy obrazów,
Reorganizacja:
train_features_images = train_images.reshape(train_images.shape[0],28,28)

Kreślenie obrazów:
import matplotlib.pyplot as plt
def show_images(features_images,labels,start, howmany):
for i in range(start, start+howmany):
plt.figure(i)
plt.imshow(features_images[i], cmap=plt.get_cmap('gray'))
plt.title(labels[i])
plt.show()
show_images(train_features_images, labels, 1, 10)

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się