如何在numpy数组中组合维度?

时间:2016-04-02 08:21:51

标签: python opencv numpy

我使用OpenCV将图片读入numpy.array,并且它们具有以下形状。

import cv2

def readImages(path):
    imgs = []
    for file in os.listdir(path):
        if file.endswith('.png'):
            img = cv2.imread(file)
            imgs.append(img)
    imgs = numpy.array(imgs)
    return (imgs)

imgs = readImages(...)
print imgs.shape  # (100, 718, 686, 3)

每张图片的尺寸均为718x686像素。有100张图片。

我不想在718x686上工作,我想将像素组合成一个维度。也就是说,形状应如下所示:(100,492548,3)。无论如何,OpenCV(或任何其他库)或Numpy是否允许我这样做?

4 个答案:

答案 0 :(得分:6)

不修改您的阅读功能:

java.sql.Time

答案 1 :(得分:2)

import cv2
import os
import numpy as np

def readImages(path):
    imgs = np.empty((0, 492548, 3))
    for file in os.listdir(path):
        if file.endswith('.png'):
            img = cv2.imread(file)
            img = img.reshape((1, 492548, 3))
            imgs = np.append(imgs, img, axis=0)
    return (imgs)

imgs = readImages(...)
print imgs.shape  # (100, 492548, 3)

诀窍是重塑并附加到一个numpy数组。硬编码向量的长度(492548)并不是一个好的做法,所以如果我是你,我还会添加一行计算这个数字并将其放入一个变量中,以供其余的使用。脚本。

答案 2 :(得分:2)

def combine_dims(a, start=0, count=2):
    """ Reshapes numpy array a by combining count dimensions, 
        starting at dimension index start """
    s = a.shape
    return numpy.reshape(a, s[:start] + (-1,) + s[start+count:])

此函数以更通用的方式满足您的需求。

imgs = combine_dims(imgs, 1) # combines dimension 1 and 2
# imgs.shape == (100, 718*686, 3)

它通过使用 numpy.reshape 工作,它将一个形状的数组转换为具有相同数据但被视为另一种形状的数组。目标形状只是初始形状,但要组合的尺寸由 -1 代替。 numpy 使用 -1 作为标志来指示它应该自己计算出该维度应该有多大(基于元素的总数。)

这段代码本质上是 Multihunter 答案的简化版本,但我的编辑被拒绝并暗示它应该是一个单独的答案。就这样吧。

答案 3 :(得分:1)

如果有人想要它。这是执行此操作的一般方法

import functools
def combine_dims(a, i=0, n=1):
  """
  Combines dimensions of numpy array `a`, 
  starting at index `i`,
  and combining `n` dimensions
  """
  s = list(a.shape)
  combined = functools.reduce(lambda x,y: x*y, s[i:i+n+1])
  return np.reshape(a, s[:i] + [combined] + s[i+n+1:])

使用此功能,您可以像这样使用它:

imgs = combine_dims(imgs, 1) # combines dimension 1 and 2
# imgs.shape = (100, 718*686, 3)