首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将特征映射(3D数组)拆分为二维数组

将特征映射(3D数组)拆分为二维数组
EN

Stack Overflow用户
提问于 2018-01-26 15:20:44
回答 3查看 2.7K关注 0票数 3

假设我有一个形状(32, 32, 96)的特征图(即三维数组)

代码语言:javascript
复制
In [573]: feature_map = np.random.randint(low=0, high=255, size=(32, 32, 96))

现在,我想将每个功能地图分别可视化。因此,我想提取每个额叶切片(即二维数组的形状(32, 32)),这样就能给出96个这样的特征图。

如何获得这些数组(可能是而不是复制)以提高内存效率?因为这只是为了可视化,所以一个视图就足够了!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-01-26 16:12:28

我还意识到可以利用numpy.dsplit()来实现这样的3D数组,因为我们正试图将其按深度划分。但是,我必须另外使用np.squeeze()来消除第三维空间。此外,根据我的情况需要,它还返回数组的视图。

代码语言:javascript
复制
# splitting it into 96 slices in one-go!
In [659]: np.dsplit(feature_map, feature_map.shape[-1])

In [660]: np.dsplit(feature_map, feature_map.shape[-1])[10].flags
Out[660]: 
  C_CONTIGUOUS : False
  F_CONTIGUOUS : False
  OWNDATA : False   #<============== NO copy is made
  WRITEABLE : True
  ALIGNED : True
  UPDATEIFCOPY : False

In [661]: np.dsplit(feature_map, feature_map.shape[-1])[10].shape
Out[661]: (32, 32, 1)

# getting rid of unitary dimension with `np.squeeze`
In [662]: np.squeeze(np.dsplit(feature_map, feature_map.shape[-1])[10]).shape
Out[662]: (32, 32)

In [663]: np.squeeze(np.dsplit(feature_map, feature_map.shape[-1])[10]).flags
Out[663]: 
  C_CONTIGUOUS : False
  F_CONTIGUOUS : False
  OWNDATA : False   #<============== NO copy is made
  WRITEABLE : True
  ALIGNED : True
  UPDATEIFCOPY : False
票数 0
EN

Stack Overflow用户

发布于 2018-01-26 15:25:30

可以使用np.transpose和切片操作(而不是创建数组的副本):

代码语言:javascript
复制
feature_map = np.random.randint(low=0, high=255, size=(32, 32, 96))
feature_map = np.transpose(feature_map, axes=[2, 0, 1])
for i in range(feature_map.shape[0]):
  print(feature_map[i].shape)  # a view of original array. shape=(32, 32)

..。或者只是切片:

代码语言:javascript
复制
for i in range(feature_map.shape[2]):
  print(feature_map[:, :, i].shape)  # a view of original array. shape=(32, 32)
票数 6
EN

Stack Overflow用户

发布于 2018-01-26 15:28:49

代码语言:javascript
复制
import numpy as np

def do_something(array_slice):
    print array_slice

feature_map = np.random.randint(low=0, high=255, size=(3, 3, 9))

# loop over the indices of the last dimension of the array (i.e. 0 to 8)
for level in range(feature_map.shape[2]):
    # now take only the 2d-slice of the first two dimensions at the height of 'level'
    do_something(feature_map[:,:,level])

# you could also take a slice from another dimension
for level in range(feature_map.shape[1]):    
    do_something(feature_map[:,level,:])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48464281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档