以np.concatenate为主题,谈谈numpy数组按维度合并的问题
1.引言
最近在做多模态融合的图像问题,其中最需要解决的就是不同模态的图像用什么方法进行融合,最简单也最直观的方法就是采用合并数组的方法,将不同模态的图像合并为多通道进行处理。在一些论文中,比如《Deep Learning-Based Image Segmentation on Multimodal Medical Imaging》中,如图1.1所示,论文中发现简单的concat 成多通道进行处理反而会比经过一部分网络提取特征后再融合效果更好。不过不同的情况需要具体分析,在《FusionNet: Incorporating Shape and Texture for Abnormality Detection in 3D Abdominal CT Scans》中,文章进行了多种组合的实验(不是模态融合,而是图片和mask的组合),结果发现某一种组合的效果最好。
图1.1 文章中提到的融合网络结构以及效果
不过总的来说,能够使用concat进行合并数组肯定是快速而有效的一种模态融合方法。
2.简要解析np.concatente官方文档
参见https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.concatenate.html
numpy.
concatenate
((a1, a2, ...), axis=0, out=None)
Join a sequence of arrays along an existing axis.
Parameters: |
|
---|---|
Returns: |
|
concatenate中含有两个参数,第一个参数是一个元组,元组里填入你想合并的数组,第二个参数是axis轴,第一个参数没什么好说的,主要想谈第二个参数。
另外要提的是官方提示,这个对我来说没什么用。
注意:当要串联的一个或多个数组为MaskedArray时,此函数将返回MaskedArray对象而不是ndarray,但不会保留输入掩码。 如果需要使用MaskedArray作为输入,请改用MaskedArray模块中的ma.concatenate函数。
正常的数组例子
>>> a = np.array([[1, 2], [3, 4]])
>>> b = np.array([[5, 6]])
>>> np.concatenate((a, b), axis=0)
array([[1, 2],
[3, 4],
[5, 6]])
>>> np.concatenate((a, b.T), axis=1)
array([[1, 2, 5],
[3, 4, 6]])
>>> np.concatenate((a, b), axis=None)
array([1, 2, 3, 4, 5, 6])
数组是MaskedArray时的例子,此函数将不会保留MaskedArray输入的掩码,要保留的话要用ma那个函数。
>>> a = np.ma.arange(3)
>>> a[1] = np.ma.masked
>>> b = np.arange(2, 5)
>>> a
masked_array(data = [0 -- 2],
mask = [False True False],
fill_value = 999999)
>>> b
array([2, 3, 4])
>>> np.concatenate([a, b])
masked_array(data = [0 1 2 2 3 4],
mask = False,
fill_value = 999999)
>>> np.ma.concatenate([a, b])
masked_array(data = [0 -- 2 2 3 4],
mask = [False True False False False False],
fill_value = 999999)
3.axis的轴到底指的是什么
网上大多介绍的是一维数组和二维数组,但是很少提到高维数组的情况,
比如说当axis=0时,这时候就是np.concatenate指的是水平合并数组,当axi=1时,指的是垂直方向合并数组,举个例子:
定义两个数组:
a
array([0, 1, 2],
[3, 4, 5],
[6, 7, 8])
b = a*2
b
array([ 0, 2, 4],
[ 6, 8, 10],
[12, 14, 16])
下面进行合并:
np.hstack((a,b))
array([ 0, 1, 2, 0, 2, 4],
[ 3, 4, 5, 6, 8, 10],
[ 6, 7, 8, 12, 14, 16]) np.concatenate((a,b),axis=1)
array([ 0, 1, 2, 0, 2, 4],
[ 3, 4, 5, 6, 8, 10],
[ 6, 7, 8, 12, 14, 16])
np.vstack((a,b))
array([ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 0, 2, 4],
[ 6, 8, 10],
[12, 14, 16]) np.concatenate((a,b),axis=0)
array([ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 0, 2, 4],
[ 6, 8, 10],
[12, 14, 16])
两种方式分别和np中的hstack以及vstack的合并数组的结果相同,那么concatenate存在的意义到底是什么呢,就在于它可以进行更高维度的数组合并。
就对我的问题而言,我要对两种模态的3d切片数据进行合并,两个数据的shape均为(10,1,128,128),如果我使用axis=1,那么不是进行垂直合并,而是选择了第二维度进行合并,比如说下面这个例子,最终输出的结果就是一个(10,2,128,128)的数组。
#coding=utf-8
import numpy as np np.random.seed(0)
a = np.random.randint(0, 255, (10, 1, 128, 128))
b = np.random.randint(0, 255, (10, 1, 128,128))
ab = np.concatenate((a,b),axis = 1)
print('ab的维度为 = \n {}'.format(ab.shape)) ab的维度为 =
(10, 2, 128, 128)
这就一目了然了,原来np.concatenate并不仅仅是水平和垂直合并,而是多个维度的合并,axis轴的选择其实就是对某一个维度的选择。
那么进行数据融合的适合就方便多了,不过要解决先让数据进入网络后再提取特征进行fusion训练就是另一个问题了,我们下次再考虑。
以np.concatenate为主题,谈谈numpy数组按维度合并的问题的更多相关文章
- 1.2 NumPy数组基础
目录 第一章 numpy入门 1.2 numpy数组基础 1.2.1 数组的属性 1.2.2 数组的索引:获取单个元素 1.2.3 数组切片:获取子数组 1.2.4 数组的变形 1.2.5 数组的拼接 ...
- 操作 numpy 数组的常用函数
操作 numpy 数组的常用函数 where 使用 where 函数能将索引掩码转换成索引位置: indices = where(mask) indices => (array([11, 12, ...
- NumPy 超详细教程(1):NumPy 数组
系列文章地址 NumPy 最详细教程(1):NumPy 数组 NumPy 超详细教程(2):数据类型 NumPy 超详细教程(3):ndarray 的内部机理及高级迭代 文章目录 Numpy 数组:n ...
- 【NumPy学习指南】day5 改变数组的维度
我们已经学习了怎样使用reshape函数,现在来学习一下怎样将数组展平. (1) ravel 我们可以用ravel函数完成展平的操作: In: b Out: array([[[ 0, 1, 2, 3] ...
- numpy——>数组拼接np.concatenate
语法:np.concatenate((a1, a2, ...), axis=0) 1.默认是 axis = 0,也就是说对0轴(行方向)的数组对象,进行其垂直方向(axis=1)的拼接(即数据整行整行 ...
- python numpy 数组拼接
我就写一下我遇到的,更多具体的请看Python之Numpy数组拼接,组合,连接 >>> aarray([0, 1, 2], [3, 4, 5], [6, 7, ...
- Numpy 数组操作
Numpy 数组操作 Numpy 中包含了一些函数用于处理数组,大概可分为以下几类: 修改数组形状 翻转数组 修改数组维度 连接数组 分割数组 数组元素的添加与删除 修改数组形状 函数 描述 resh ...
- Python数据分析工具库-Numpy 数组支持库(二)
1 shape变化及转置 >>> a = np.floor(10*np.random.random((3,4))) >>> a array([[ 2., 8., 0 ...
- numpy数组 拼接
转载自:https://blog.csdn.net/zyl1042635242/article/details/43162031 数组拼接方法一 首先将数组转成列表,然后利用列表的拼接函数append ...
随机推荐
- 2018年蓝桥杯java b组第四题
标题:测试次数 x星球的居民脾气不太好,但好在他们生气的时候唯一的异常举动是:摔手机.各大厂商也就纷纷推出各种耐摔型手机.x星球的质监局规定了手机必须经过耐摔测试,并且评定出一个耐摔指数来,之后才允许 ...
- python的元组存储的实质和多元赋值
python中有一种赋值机制即多元赋值,采用这种方式赋值时,等号两边的对象都是元组并且元组的小括号是可选的.通常形式为 x, y, z = 1, 2, 'a string' 等同于 (x, y, z) ...
- 基于操作系统原理的Linux的内存管理
一.实验目的 1.理解虚拟内存.磁盘缓存的概念. 2.掌握基本的内存管理知识. 3.掌握查看实时查看内存.内存回收的方法 二.实验内容 1. 监控内存使用情况 2. 检查和回收内容 三.实验平台 1. ...
- mybatis 配置之<typeAliases>别名配置元素设置
一.方式一:使用typeAlias <typeAliases> <typeAlias alias="User" type="com.**.entity. ...
- Lxde添加触摸板双击功能、防误触
前言 本文链接:https://www.cnblogs.com/hellxz/p/linux_touchpad_settings.html 这时简单记录一下最近两天折腾Lxde的触摸板功能的设置,留待 ...
- Basic Example using SMTP (for PHPMailer v5.0.0 and up)
sample as below: require_once('../class.phpmailer.php'); //include("class.smtp.php"); // o ...
- mybatis - 通用mapper
title: 玩转spring-boot-mybatis date: 2019-03-11 19:36:57 type: "mybatis" categories: mybatis ...
- 检测MySQL主从是否异常
#!bin/bash user='root' passwd="123" host="192.168.192.156" mycmd="mysql -u$ ...
- Linux Shell 基础知识(二)
1.本文知识结构 2.文件的查询与检索 2.1. cd 目录切换 找到文件/目录位置:cd 切换到上一个工作目录: cd - 切换到home目录: cd or cd ~ 显示当前路径: pwd 更改当 ...
- Eclipse导入别人项目爆红叉
1.导入项目之前,请确认工作空间编码已设置为utf-8:window->Preferences->General->Wrokspace->Text file encoding- ...