Хотите создать пустую матрицу неизвестного размера и добавить векторы признаков

Я хочу добавить векторы функций HoG к пустой матрице неизвестного размера. Обязательно ли заранее указывать размер матрицы? Я пробовал код на Python, но он говорит, что все входные массивы должны иметь одинаковый размер.

import matplotlib.pyplot as plt
from skimage.feature import hog
from skimage import data, exposure, img_as_float
from skimage import data
import numpy as np
from scipy import linalg
import cv2
import glob


shape = (16576, 1)
X = np.empty(shape)
print X.shape
hog_image = np.empty(shape)
hog_image_rescaled = np.empty(shape)

for img in glob.glob("/home/madhuri/pythoncode/faces/*.jpg"):
   n= cv2.imread(img)
   gray = cv2.cvtColor(n, cv2.COLOR_RGB2GRAY)
   hog_image = hog(gray, orientations=9, pixels_per_cell=(16, 16),     
                   cells_per_block=(3, 3), visualise=False)
   hog_image_rescaled = exposure.rescale_intensity(hog_image,
                                                   in_range=(0,10))  
   X = np.append(X, hog_image_rescaled, axis=1)

print 'X is'
print np.shape(X)

31 X = np.append (X, hog_image_rescaled, ось = 1)

matumul 10.09.2018 08:03

ValueError: все входные массивы должны иметь одинаковое количество измерений

matumul 10.09.2018 08:04

Это ошибка, которую я получил.

matumul 10.09.2018 08:04
X имеет два измерения. Сколько размеров у hog_image_rescaled?
MaxPowers 10.09.2018 09:53

Не существует такой вещи, как массив с неизвестным размером. Также не путайте np.empty с пустым списком []. И не используйте np.append в цикле. А еще лучше вообще не использовать np.append.

hpaulj 10.09.2018 19:34
1
5
123
1

Ответы 1

X = []    # use an 'empty' list
# hog_image = np.empty(shape)  # no point initializing these variables
# hog_image_rescaled = np.empty(shape)  # you just reassign them in the loop

for img in glob.glob("/home/madhuri/pythoncode/faces/*.jpg"):
   n= cv2.imread(img)
   gray = cv2.cvtColor(n, cv2.COLOR_RGB2GRAY)
   hog_image = hog(gray, orientations=9, pixels_per_cell=(16, 16),     
                   cells_per_block=(3, 3), visualise=False)
   hog_image_rescaled = exposure.rescale_intensity(hog_image,
                                                   in_range=(0,10))  
   X.append(hog_image_rescaled)

Теперь X будет списком измененных изображений. Эти элементы теперь могут быть объединены по любому подходящему измерению:

np.concatenate(X, axis=1)
np.stack(X)
# etc

Списочная модель

alist = []
for ....
    alist.append(...)

плохо переводится в массивы. np.append является прикрытием для np.concatenate и создает новый массив, который стоит дороже, чем добавление в список. И определить хороший начальный «пустой» массив для такого цикла сложно. np.empty не подходит:

In [977]: np.empty((2,3))
Out[977]: 
array([[1.48e-323, 1.24e-322, 1.33e-322],
       [1.33e-322, 1.38e-322, 1.38e-322]])
In [978]: np.append(_, np.zeros((2,1)), axis=1)
Out[978]: 
array([[1.48e-323, 1.24e-322, 1.33e-322, 0.00e+000],
       [1.33e-322, 1.38e-322, 1.38e-322, 0.00e+000]])

Другие вопросы по теме