我试图通过将每个图像的numpy数组附加到该单个数组来读取30个图像并从中创建一个大的numpy数组,以便稍后我可以在keras的流函数中使用它。
我有一个空列表,我在循环中进行面部检测后附加numpy数组,之后我从这个列表中创建一个大的numpy数组。问题是,当我从这个列表中创建一个numpy数组时,它会将我的数组的形状(最初为(1,139,139,3))更改为(30,1,139,139,3)。当我追加时,它基本上会在开始时添加图像总数,并且我想恢复到原始形状。我不想使用重塑,因为这可能会影响数据。
以下是代码:
img_width, img_height = 139, 139
confidence = 0.8
#graph = K.get_session().graph
data1 = []
def get_face(path):
with graph.as_default():
img = io.imread(path)
dets = detector(img, 1)
output = None
for i, d in enumerate(dets):
img = img[d.top():d.bottom(), d.left():d.right()]
img = resize(img, (img_width, img_height))
output = np.expand_dims(img, axis=0)
break
return output
for row in df.itertuples():
data1.append(get_face(row[1]))
data1 = np.array(data1)
print(data1)
答案 0 :(得分:2)
@filippo指出你可能想省略np.expand_dims
。
img_width, img_height = 139, 139
confidence = 0.8
#graph = K.get_session().graph
data1 = []
def get_face(path):
with graph.as_default():
img = io.imread(path)
dets = detector(img, 1)
output = None
for i, d in enumerate(dets):
img = img[d.top():d.bottom(), d.left():d.right()]
output = resize(img, (img_width, img_height))
break
return output
for row in df.itertuples():
data1.append(get_face(row[1]))
data1 = np.array(data1)
print(data1)
这段代码将生成一个包含形状(139, 139, 3)
的30个numpy数组的列表。在其上调用np.array
构造函数将为您提供形状为(30, 139, 139, 3)
的数组。您还应该阅读np.stack和np.concatenate的文档。使用第二个函数,如果出于任何原因需要,可以实际保存np.expand_dims
。
答案 1 :(得分:1)
np.array
在新的前端维度上加入列表的元素:
In [141]: alist = []
In [142]: for i in range(2):
...: arr = np.zeros((3,4))
...: alist.append(arr)
...:
In [143]: np.array(alist).shape
Out[143]: (2, 3, 4)
expand_dims
添加了一个新维度:
In [144]: alist = []
In [145]: for i in range(2):
...: arr = np.zeros((3,4))
...: arr = np.expand_dims(arr,0)
...: alist.append(arr)
...:
In [146]: np.array(alist).shape
Out[146]: (2, 1, 3, 4)
concatenate
加入现有维度:
In [149]: np.concatenate(alist, axis=0).shape
Out[149]: (2, 3, 4)
np.array
的替代方法是np.stack
。