如何在追加时避免改变numpy数组的形状?

时间:2018-02-13 14:50:50

标签: python arrays numpy append

我试图通过将每个图像的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)

2 个答案:

答案 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.stacknp.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