将维度添加到Numpy数组

Chr*_*ris 52 python arrays opencv numpy

我开始使用numpy数组图像.

In[1]:img = cv2.imread('test.jpg')
Run Code Online (Sandbox Code Playgroud)

形状是您对640x480 RGB图像的期望.

In[2]:img.shape
Out[2]: (480, 640, 3)
Run Code Online (Sandbox Code Playgroud)

但是,我拥有的这个图像是一个100帧长的视频帧.理想情况下,我希望有一个包含此视频中所有数据的单个数组,以便img.shape返回(480, 640, 3, 100).

将下一帧(即下一组图像数据,另一个480 x 640 x 3阵列)添加到我的初始阵列的最佳方法是什么?

dbl*_*iss 54

您正在询问如何向NumPy数组添加维度,以便可以增大该维度以适应新数据.可以按如下方式添加维度:

__CODE__.

  • 不要使用"无".使用`np.newaxis`因为显式优于隐式. (29认同)
  • 怎么可能?“无”并不意味着任何事情。这是明确的。是“无”。明确指出。`None` **是** python 中的一个_thing_。毫无疑问。“无”是最后一个细节,你不能再深入。另一方面,“numpy.newaxis”意味着“None”。本质上,它是“无”。是“无”。但隐含的是“None”。虽然没有直接表示为“None”,但它是“None”。**显式** _清晰详细地说明,不留任何混乱或怀疑的余地。_ **隐式** _建议,但没有直接表达。_ 我必须补充一点,从 API 角度来看,使用 `numpy 更安全.newaxis`。 (8认同)
  • 这里我猜,明确是指“编码者意图”,而不是语法/语义的清晰度。 (6认同)
  • 目前,`numpy.newaxis`被定义为`None`(在文件`numeric.py`中),因此等效地你可以使用`image = image [...,None]. (5认同)
  • 由于标题询问如何添加(多个)维度**,我想添加一种添加“n”维度的方法:“a[(..., *([np.newaxis] * n))] `。构造“元组”的括号是解压“n”乘“np.newaxis”的“列表”所必需的 (2认同)

Cle*_*leb 34

或者替代

image = image[..., np.newaxis]
Run Code Online (Sandbox Code Playgroud)

在@dbliss的回答中,你也可以使用numpy.expand_dims喜欢

image = np.expand_dims(image, <your desired dimension>)
Run Code Online (Sandbox Code Playgroud)

例如(取自上面的链接):

x = np.array([1, 2])

print(x.shape)  # prints (2,)
Run Code Online (Sandbox Code Playgroud)

然后

y = np.expand_dims(x, axis=0)
Run Code Online (Sandbox Code Playgroud)

产量

array([[1, 2]])
Run Code Online (Sandbox Code Playgroud)

y.shape
Run Code Online (Sandbox Code Playgroud)

(1, 2)
Run Code Online (Sandbox Code Playgroud)


Jos*_*del 20

您可以在前面创建一个正确大小的数组并填充它:

frames = np.empty((480, 640, 3, 100))

for k in xrange(nframes):
    frames[:,:,:,k] = cv2.imread('frame_{}.jpg'.format(k))
Run Code Online (Sandbox Code Playgroud)

如果帧是以某种特定方式命名的单个jpg文件(在示例中为frame_0.jpg,frame_1.jpg等).

只需注意,您可以考虑使用(nframes, 480,640,3)形状阵列.

  • 我认为这是要走的路。如果使用串联,则每次添加数组时都需要在内存中移动数组。对于 100 帧来说这根本不重要,但如果你想观看更大的视频。顺便说一句,我会使用帧数作为第一个维度,因此有一个 (100,480,640,3) 数组,这样您就可以访问各个帧(您通常想要查看什么,对吧?)更容易(F[1 ] 而不是 F[:,:,:,1])。当然,就性能而言,这根本不重要。 (2认同)

0-_*_*_-0 18

蟒蛇式

X = X[:, :, None]

这相当于

X = X[:, :, numpy.newaxis]X = numpy.expand_dims(X, axis=-1)

但是,当您明确询问堆叠图像时,我建议您将可能收集到list的图像np.stack([X1, X2, X3])进行循环堆叠。

如果您不喜欢尺寸的顺序,您可以重新排列 np.transpose()


小智 13

a = np.expand_dims(a, axis=-1) 
Run Code Online (Sandbox Code Playgroud)

或者

a = a[:, np.newaxis] 
Run Code Online (Sandbox Code Playgroud)

或者

a = a.reshape(a.shape + (1,))
Run Code Online (Sandbox Code Playgroud)


Sau*_*tro 6

您可以使用np.concatenate()指定axis要追加的内容np.newaxis

import numpy as np
movie = np.concatenate((img1[:,np.newaxis], img2[:,np.newaxis]), axis=3)
Run Code Online (Sandbox Code Playgroud)

如果要读取许多文件:

import glob
movie = np.concatenate([cv2.imread(p)[:,np.newaxis] for p in glob.glob('*.jpg')], axis=3)
Run Code Online (Sandbox Code Playgroud)