沈逸飛 任春龍 胡云飛 王麗麗
摘要:在計(jì)算機(jī)高級(jí)編程語(yǔ)言中,數(shù)組是一種最常見(jiàn)且應(yīng)用廣泛的數(shù)據(jù)結(jié)構(gòu)。不同的程序設(shè)計(jì)語(yǔ)言在數(shù)據(jù)合并上采取不同的實(shí)現(xiàn)方式,其合并程序在時(shí)間和空間效率也存在很大的差別。該文主要研究了C語(yǔ)言、Java、python三種語(yǔ)言中數(shù)組合并的實(shí)現(xiàn)方法,并通過(guò)程序?qū)嵗M(jìn)行演示,對(duì)其時(shí)間和空間復(fù)雜度分別進(jìn)行了詳細(xì)的分析。實(shí)驗(yàn)結(jié)果表明,C語(yǔ)言在實(shí)現(xiàn)數(shù)組合并時(shí)效果最好,代碼利用率更高,而且不受數(shù)組類型影響。當(dāng)數(shù)組元素個(gè)數(shù)很少時(shí),采用Java語(yǔ)言循環(huán)遍歷更好,當(dāng)數(shù)組元素個(gè)數(shù)很大時(shí),使用System.arraycopy效率是最好;對(duì)于Python語(yǔ)言,采用不同的方法所用的時(shí)間復(fù)雜度相同。通過(guò)對(duì)比三種語(yǔ)言在數(shù)據(jù)合并中的性能差別,有助于用戶根據(jù)實(shí)際應(yīng)用需求合理選擇適合的合并方法。
關(guān)鍵詞:數(shù)組合并;strcat函數(shù);NumPy;循環(huán)遍歷
中圖分類號(hào):G642.0 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2020)03-0078-05
1 背景
在計(jì)算機(jī)程序設(shè)計(jì)中,通常將相同類型數(shù)據(jù)的有序集合稱為數(shù)組,數(shù)組在處理大量數(shù)據(jù)的存儲(chǔ)和調(diào)用時(shí)可以有效簡(jiǎn)化程序,數(shù)組相關(guān)的一類重要應(yīng)用就是合并數(shù)組。相關(guān)的程序設(shè)計(jì)語(yǔ)言中,對(duì)于合并數(shù)組的方法描述有一些是模糊的,如C語(yǔ)言中可以通過(guò)指針的相關(guān)調(diào)用來(lái)合并數(shù)組,但書(shū)中并未直接給出相關(guān)方法;有一些則是直接給出相關(guān)函數(shù),如Python中的extend()方法可以直接將另一個(gè)列表數(shù)組追加到當(dāng)前列表數(shù)組中。因此本文給出了C語(yǔ)言、Java、Python三種程序設(shè)計(jì)語(yǔ)言中的幾種數(shù)組合并方法,本文所給代碼均經(jīng)過(guò)DEV-C++5.4.0、Eclipse、jdkl.8、PyCharm編譯通過(guò)。
2 數(shù)組合并的方法
2.1 C語(yǔ)言
數(shù)組是C語(yǔ)言中重要的數(shù)據(jù)結(jié)構(gòu)。在C語(yǔ)言中數(shù)組可分為一維數(shù)組、二維數(shù)組、字符數(shù)組三種類型的數(shù)組,所要合并的數(shù)組必須是同一類型的數(shù)組。在C語(yǔ)言中數(shù)組的合并方法主要有三種:創(chuàng)建新數(shù)組(將所要合并的兩個(gè)數(shù)組逐一復(fù)制進(jìn)去)、利用指針、調(diào)用strcat[3]函數(shù),其中strcat函數(shù)只能在字符數(shù)組中使用。
2.1.1 創(chuàng)建新數(shù)組
#include
#include
void main0{
int a[3]-{1,2,3),b[4]={4,5,6,7),c[7];
int i=0,m=0,n=0;
while(i<7){
if(m<3){
c[i++]-a[m++];)
elsef
c[i++]=b[n++];))
for(i=0;i<7;i++)
printf(”%d”,c[i]);
l//輸出結(jié)果:
1 2 3 4 5 6 7
在上述程序中,先創(chuàng)建兩個(gè)一維數(shù)組a[3]、b[4]用于合并,再創(chuàng)建一個(gè)空的一維數(shù)組c[7],長(zhǎng)度為要合并數(shù)組長(zhǎng)度之和,再利用while(i<7)語(yǔ)句來(lái)限定復(fù)制到c[7]中的元素個(gè)數(shù)不超過(guò)7,用if(m<3)確保a[3]中的3個(gè)元素都被使用,用c[i++]_a[m++]將各個(gè)元素復(fù)制到c[7]中,復(fù)制b[4]類似。再將c[7]中的每個(gè)元素打印出來(lái),方便對(duì)比程序功能是否實(shí)現(xiàn)。
2.1.2 利用指針[4]
#include
#include
void merge(char*c,char*a,char* b){
while(*a!=\0){
*C++=*a++:
)
while(%!=\0,){
*c++=*b++:
))
void main0{
char c[120];
char a[]=”Ilike”,b[]=”book”;
merge(c,a,b);
printf(”%s\n”,c);
1//輸出結(jié)果:
I like book
在處理字符數(shù)組時(shí)有時(shí)會(huì)用到指針,在某些情況下可以減小程序復(fù)雜度。本程序中先創(chuàng)建一個(gè)合并函數(shù)merge,有三個(gè)變量*c,*a*b,定義運(yùn)算規(guī)則為將*a、*b所指定的數(shù)組元素逐個(gè)復(fù)制到*c所指定的數(shù)組中,在定義時(shí)用while(*a!=\0)來(lái)判定*a所指定數(shù)組是否復(fù)制完畢,若未復(fù)制完,繼續(xù)執(zhí)行mc++=*a++語(yǔ)句將*a指定數(shù)組元素復(fù)制到*c指定的數(shù)組中,復(fù)制*b時(shí)類似。然后在主函數(shù)中定義相應(yīng)的數(shù)組,目標(biāo)數(shù)組長(zhǎng)度應(yīng)設(shè)置的足夠大,然后調(diào)用函數(shù)merge實(shí)現(xiàn)數(shù)組合并,將目標(biāo)數(shù)組逐個(gè)打印出來(lái)。
2.1.3 strcat函數(shù)
#include
#include
#include
void main0{
char strl[120]=”Ilike”,str2[60]=”book”;
strcat(strl,str2);
printf(”% s\n”,strl);
1//輸出結(jié)果:
Ilike book
該函數(shù)的功能是將str2的內(nèi)容和字符串結(jié)束標(biāo)記\0一起連接到strl的尾部。連接后,原strl的\0會(huì)被自動(dòng)覆蓋,生成的新串存放在strl中。其中strl必須是字符數(shù)組,而str2可以是字符串常量、也可以是字符數(shù)組,值得注意的是strl必須有足夠的長(zhǎng)度以容納連接后的新串內(nèi)容。在程序中可以直接調(diào)用strcat函數(shù)完成兩個(gè)滿足條件的字符數(shù)組合并。在本程序中先創(chuàng)建strl[120]、str2[60]兩個(gè)字符數(shù)組,再用strcat(strl,str2)語(yǔ)句將str2連接到strl的尾部,最后將strl打印出來(lái),方便查看程序功能是否實(shí)現(xiàn)。
2.2 Java語(yǔ)言
2.2.1 Arrays類
lava中包裝數(shù)組的一些基本用法的抽象類java. util.Ar-rays[1],這個(gè)類中包含操作數(shù)組的一些算法,該類中包含了一些用來(lái)直接操作數(shù)組的方法。它提供的所有方法都是靜態(tài)的。Ja-va.utiI.ArrayList是大小可變的數(shù)組的實(shí)現(xiàn),存儲(chǔ)在內(nèi)的數(shù)據(jù)稱為元素,此類提供一些方法來(lái)操作內(nèi)部存儲(chǔ)的元素。ArrayList中可不斷添加元素,其大小也自動(dòng)增長(zhǎng),可以存儲(chǔ)任意多的對(duì)象,但是只能存儲(chǔ)對(duì)象,不能存儲(chǔ)原生數(shù)據(jù)類型。addAlI是傳人一個(gè)List,將此List中的所有元素加入當(dāng)前List中,也就是當(dāng)前List會(huì)增加的元素個(gè)數(shù)為傳人的List的大小。ArrayList提供了一個(gè)將List轉(zhuǎn)為數(shù)組的一個(gè)非常方便的方法toArray。
importjava.util.*;
publicclass lwdml{
publicstaticvoidmain(String args[D{
String stl[]={”1”,”2”,”3”);
String st2[]={”4”,”5”,”6”);
Listlist= newArrayList(Arrays.asList(stl》;
list.addAll(Arrays.asList(st2》;
Object[] st= list.toArray0;
System.out.println(Arrays.toString(s t》;
)
】//輸出結(jié)果:[1,2,3,4,5,6]
定義兩個(gè)數(shù)組,使用Java中的Arrays工具類,調(diào)用ArrayList類創(chuàng)建一個(gè)ArrayList的對(duì)象,將數(shù)組元素添加到集合中。再調(diào)用ArrayList類中的toArray方法中的list.toArray0將list直接轉(zhuǎn)為Object口數(shù)組.或者調(diào)用toArray方法中的list.toArray(T[]a)將list轉(zhuǎn)化為你所需要類型的數(shù)組,注意使用的時(shí)候會(huì)轉(zhuǎn)化為與list內(nèi)容相同的類型。
2.2.2 循環(huán)遍歷[2]
循環(huán)結(jié)構(gòu)是在一定條件下,反復(fù)執(zhí)行某一語(yǔ)句的控制流程。循環(huán)控制結(jié)構(gòu)包括循環(huán)條件、初始部分和循環(huán)體三部分。
for循環(huán)是Java循環(huán)結(jié)構(gòu)中最常用到的,for循環(huán)在第一次循環(huán)前要進(jìn)行初始化。之后它會(huì)進(jìn)行條件測(cè)試,而且在每一次循環(huán)結(jié)束時(shí),會(huì)修改循環(huán)變量。
系統(tǒng)執(zhí)行for語(yǔ)句時(shí),首先對(duì)循環(huán)變量進(jìn)行初始化,然后判斷布爾表達(dá)式的值,若為假,跳出for循環(huán);若為真,則執(zhí)行循環(huán)體后在執(zhí)行修改循環(huán)變量,一次循環(huán)結(jié)束。下一次循環(huán)從判斷布爾表達(dá)式的值開(kāi)始,結(jié)果為真,繼續(xù)循環(huán),結(jié)果為假則退出for循環(huán)。
但使用for循環(huán)將原數(shù)組的每個(gè)元素賦值給新數(shù)組的對(duì)應(yīng)元素,效率低。
publicclass lwdm2{
publicstaticvoidmain(String args[1){
String[] stl={”1”,”2”,”3”);
String[] st2={”4”,”5”,”6”);
String[] st= new String[stl.length+st2.length];
for(int x=O;x
st[x]= stl[x];
for(int y=O;y
st[stl.length+y]=st2[y];
)
for(int z=O;z
System.out.print(st[z]+“”);
】
)
1//輸出結(jié)果:123456
上面的程序段是三個(gè)for語(yǔ)句實(shí)現(xiàn)了數(shù)組合并的功能,利用for循環(huán)語(yǔ)句,分別對(duì)要合并的數(shù)組中的每一個(gè)元素進(jìn)行遍歷,再將原數(shù)組的每個(gè)元素賦值給新數(shù)組的對(duì)應(yīng)元素,新的數(shù)組的長(zhǎng)度是要合并數(shù)組長(zhǎng)度之和。
2.2.3 System.arraycopy0方法
Java中沒(méi)有二維數(shù)組的概念,平常實(shí)現(xiàn)的二維數(shù)組只是元素是一維數(shù)組3-維數(shù)組,而數(shù)組也是引用類型,繼承自O(shè)bject類。System中提供了一個(gè)native靜態(tài)方法arraycopy0,可以使用這個(gè)方法來(lái)實(shí)現(xiàn)數(shù)組之間的復(fù)制。對(duì)于一維數(shù)組來(lái)說(shuō),這種復(fù)制屬性值傳遞,修改副本不會(huì)影響原來(lái)的值。對(duì)于二維或者一維數(shù)組中存放的是對(duì)象時(shí),復(fù)制結(jié)果是一維的引用變量傳遞給副本的一維數(shù)組,修改副本時(shí),會(huì)影響原來(lái)的數(shù)組。
importjava.util.Arrays;
publicclass lwdm3{
publicstaticvoidmain(String args[1){
String[] stl={”l”,”2”,”3”);
String[] st2={”4”,”5”,”6”);
int stILength= stl.length;
int st2length= st2.length;
stl= Arrays.copyOf(stl, stlLength+st2length);
System.arraycopy(st2,0,stl, stILength, st2length);
System.out.println(Arrays.toString(stl》;
)
)//輸出結(jié)果:[1,2,3,4,5,6]
從指定源數(shù)組中復(fù)制一個(gè)數(shù)組,復(fù)制從指定的位置開(kāi)始,到目標(biāo)數(shù)組的指定位置結(jié)束。從src引用的源數(shù)組到dest引用的目標(biāo)數(shù)組,數(shù)組組件的一個(gè)子序列被復(fù)制下來(lái)。被復(fù)制的組件的編號(hào)等于length參數(shù)。copyOf0的實(shí)現(xiàn)是用的是array-Copy0,arrayCopy0需要目標(biāo)數(shù)組,對(duì)兩個(gè)數(shù)組的內(nèi)容進(jìn)行可能不完全的合并操作。
2.3 python語(yǔ)言
數(shù)組是Python中最常用的數(shù)據(jù)類型,它可以用一個(gè)方括號(hào)內(nèi)的逗號(hào)分隔值出現(xiàn)。在python中數(shù)組的數(shù)據(jù)項(xiàng)不需要具有相同的類型,創(chuàng)建一個(gè)列表,只要把逗號(hào)分隔的不同的數(shù)據(jù)項(xiàng)使用方括號(hào)括起來(lái)即可。對(duì)于一些基本的數(shù)組功能,我們可以通過(guò)列表、元組等數(shù)據(jù)類型實(shí)現(xiàn)。由于在數(shù)據(jù)量很大時(shí),使用列表、元組來(lái)處理數(shù)據(jù)的速度就會(huì)慢的讓人難以接受。為此Python語(yǔ)言提供了一個(gè)擴(kuò)展程序庫(kù)NumPy,NumPy提供了真正的數(shù)組功能,以及對(duì)數(shù)據(jù)進(jìn)行快速處理的函數(shù)。
2.3.1基本類型
Python中的數(shù)組可以分為列表、元組、詞典三種類型,其中列表在初始化后可通過(guò)特定的方法來(lái)動(dòng)態(tài)添加數(shù)組元素;一旦元組定以后,其元素的值是不能改變的;詞典即是Hash數(shù)組。由于在數(shù)據(jù)量很大時(shí),使用這幾種類型的操作運(yùn)行速度就會(huì)慢的讓人難以接受。所以一般它們只用于存儲(chǔ)一些基礎(chǔ)、小型數(shù)據(jù)。
以下給出列表的合并方法,元組的合并方法與其類似。
1) extend方法
extend0可以將另一個(gè)列表追加到當(dāng)前列表中。追加時(shí),列表中的每一個(gè)元素按照次序依次追加到列表中,相當(dāng)于列表合并。
#coding=utf-8
import networkx as nx
listl=[l。2,3,4]
list2=[4,5,6,7]
listl.extend(list2)
print(listl)
listl=list(set(listl》
print(listl)
//輸出結(jié)果:
[1,2,3,4,4,5,6,7]
[1,2,3,4,5,6,7]
上述程序中,對(duì)listl與list2兩個(gè)列表數(shù)組調(diào)用extend0進(jìn)行合并,根據(jù)結(jié)果觀察,extend0將list2追到listl中,然后利用set()方法去除重復(fù)的數(shù)據(jù)。
2)直接相加法“+”
“+”也可用于列表的合并,通過(guò)“+”運(yùn)算將兩個(gè)列表的元素按先后順序合并一起,它的效果與extend0類似。
#coding=utf-8
import networkx as nx
listl=[l,2,3,4,5]
list2=[3,4,5,6,7]
listl=listl+list2
print(listl)
listl=list(set(listl》
print(listl)
//輸出結(jié)果:
[1,2,3,4,5,3,4,5,6,7]
[1,2,3,4,5,6,7]
上述程序中,對(duì)listl與list2兩個(gè)列表數(shù)組使用“+”進(jìn)行合并,根據(jù)結(jié)果觀察,它將list2追到listl中.最后利用set0方法去除重復(fù)的數(shù)據(jù)??梢?jiàn)“+”與extend0方法作用相同。
2.3.2 NumPy(Numerical Python)'s]
Python語(yǔ)言提供了一個(gè)擴(kuò)展程序庫(kù)NumPy(Numerical Py-thon),NumPy是一個(gè)Python科學(xué)計(jì)算的基礎(chǔ)模塊。它不僅能夠完成科學(xué)計(jì)算的任務(wù),還能夠被用作有效的多維數(shù)據(jù)容器,可以用于存儲(chǔ)和處理大型數(shù)組和矩陣。它支持大量的維度數(shù)組與矩陣運(yùn)算,此外也針對(duì)數(shù)組運(yùn)算提供大量的數(shù)學(xué)函數(shù)庫(kù)。因此我們可以根據(jù)Numpy中的函數(shù)來(lái)實(shí)現(xiàn)數(shù)組的拼接合并。
1) np.append0
NumPy提供了numpy.append(arrays,values,axis)函數(shù)。ap-pend函數(shù)對(duì)參數(shù)規(guī)定,只能用于一個(gè)數(shù)組和一個(gè)數(shù)值之間或者兩個(gè)數(shù)組之間的合并拼接,不能對(duì)三個(gè)及其以上數(shù)組進(jìn)行拼接。
#coding=utf-8
import numpy as np
a=[1,2,3,4,5]
b=[6,7,8,9,10]
c= np.append(a,10)
print(c)
c= np.append(a,b)
print(c)
//輸出結(jié)果:
[1 2 3 4 510]
[1 2 3 4 5 6 7 8 910]
上述程序中,append函數(shù)將數(shù)據(jù)10增加到數(shù)組a;通過(guò)ap-pend將數(shù)組a,b進(jìn)行合并,通過(guò)append函數(shù)實(shí)現(xiàn)了數(shù)與數(shù)組和數(shù)組與數(shù)組的合并。如果需要對(duì)合并后的數(shù)組進(jìn)行排序,可以通過(guò)Set0方法實(shí)現(xiàn)。
c= np.append(b,a)
print(c)
c= list(set(c》
print(c)
//輸出結(jié)果:
[6 7 8 910 1 2 3 4 5]
[1,2,3,4,5,6,7,8,9,10]
2) np.concatenate0
NumPy提供了numpy.concatenate《al,a2,…),axis)函數(shù),它能夠一次完成多個(gè)數(shù)組的拼接,傳人的參數(shù)必須是一個(gè)多個(gè)數(shù)組的元組或者列表。另外還需指定拼接的方向,即axis aⅪs“;的取值,當(dāng)axis=0時(shí)對(duì)行方向進(jìn)行拼接;當(dāng)axis=l時(shí)對(duì)列方向進(jìn)行拼接;當(dāng)axis=2(或-1)時(shí)對(duì)深度方向進(jìn)行拼接。其中參數(shù)數(shù)組的維度必須大于axis的取值。
#coding=utf-8
lmport numpy as np
a=[[[1,2,3],[4,5,6]]]
b=[[[7,8,9],[10,1 1,12]]]
c = np.concatenate《a, b),axis=0)
print(c)
c= np.concatenate《a, b),axis=l)
print(c)
c= np.concatenate《a, b),axis=2)
print(c)
//輸出結(jié)果:
[[[1 2 3][4 5 6]][[7 8 9][101112]]]
[[[1 2 3][4 5 6][7 8 9][101112]]]
[[[1 2 3 7 8 9][4 5 6101112]]]
對(duì)于axis的不同取值,得到的數(shù)組是不同的,axis=0時(shí),在a的第一維度直接加上b中的元素;第二個(gè)np. concatenate《a,b),axis=l),則在a的第二維加上b的元素,所以這里axis=i時(shí),輸入?yún)?shù)(al,a2,a3…)除了第i維,其余維度的shape應(yīng)該一致;同理,當(dāng)axis=2時(shí),是對(duì)三維上的數(shù)據(jù)進(jìn)行合并。
3) np.stack0
stack(arrays,axis,out=None),它的兩個(gè)主要參數(shù),一個(gè)是ar-rays,也就是用來(lái)作為堆疊的數(shù)組,要求每個(gè)array的形狀維度必須相等;第二個(gè)參數(shù)為axis也就是指定依照維度進(jìn)行堆疊,返回值的維度比原arrays的維度高1。
#coding=utf-8
lmport numpy as np
a=[[1,2,3M4,5,6]]
b=[[1,2,3],[4,5,6]]//定義二維數(shù)組
c=np.stack([a,b],axis=O)//-維
print(c)
c=np.stack([a,b],axis=1)//二維
print(c)
c=np.stack([a,b],axis=2)//三維
print(c)
//輸出結(jié)果:
[[[1 2 3][4 5 6]][[1 2 3][4 5 6]]]
[[[1 2 3][1 2 3]][[4 5 6][4 5 6]]]
[[[1 1][2 2][3 3]][[4 4][5 5][6 6]]]
a.b經(jīng)stack0方法合并后生成的數(shù)組比它們要大一維,stack()中axis=0將原數(shù)組上下堆疊,增加了第一維度,a、b兩個(gè)數(shù)組被依次存到c中;當(dāng)axis=l時(shí),原來(lái)的a[0][0]=1,因?yàn)檫@里axis=l,現(xiàn)在中間在加上一個(gè)維度,就變成了c[0][0][0]=1,注意中間的0,是因?yàn)閚p.stack《a,b),axis=l)中,a在b的前面。同理那么b[0][0]=1,因?yàn)樵趎p.stack《a,b),axis=l)中,b在a的后面,所以c[0][1][0]=l;axis取值為2時(shí),就是在三維上進(jìn)行合并操作,即a[0][1]-2時(shí),在后面增加一個(gè)維度,因?yàn)閚p.stack《a,b),axis=2),所以c[0][1][0]=2。
4) np.vstack0
Vstack即Vertical stack,垂直(按行)順序堆疊數(shù)組,垂直拼接,沿著列的方向,對(duì)行進(jìn)行拼接。等價(jià)于np.concatenate(arr,axis=0)。除了第一個(gè)軸之外,所有數(shù)組都必須具有相同的形狀。一維數(shù)組的長(zhǎng)度必須相同。通過(guò)vstack0堆疊給定的數(shù)組最后形成的數(shù)組將至少為二維的
#coding=utf-8
lmport numpy as np
a=[1,2,3]
b=h5,6]//定義一維數(shù)組
c= np.vstack([a,b])
print(c)
a=[[1,2,3]]
b=[[4,5,6]]//定義二維數(shù)組
c= np.vstack([a,b])
print(c)
//輸出結(jié)果:
[[1 2 3][4 5 6]]
[[1 2 3][4 5 6]]
在上述程序中,在一維數(shù)組中,a、b二者在0號(hào)軸上連接起來(lái),a被存到c[0]中b被存到c[l]中;對(duì)于兩個(gè)二維數(shù)組a、b來(lái)說(shuō),a、b在0號(hào)軸上a在前2層b在后2層。觀察一維和二維數(shù)組的情況,b在結(jié)果中被排在a的后面,形成a在上,b在下的垂直關(guān)系。
5) np.hstack0
Hstack即Horizontal stack,水平即按列順序堆疊數(shù)組,水平拼接,沿著行的方向,對(duì)列進(jìn)行拼接。等價(jià)于np.concatenate(arr,axis=l)。除了第二個(gè)軸之外,數(shù)組必須具有相同的形狀,除了可以是任意長(zhǎng)度的一維數(shù)組。
#coding=utf-8
import numpy as np
a=[1,2]
b=[3,4]//定義一維數(shù)組
c= np.hstack([a.b])
print(c)
a=[[1,2],[3,4]]
b=[[5,6],[7,8]]//定義二維數(shù)組
c= np.hstack([a,b])
print(c)
//輸出結(jié)果:
[12 3 4]
[[12 5 6][3 4 7 8]]
觀察上述程序,與vstack0相比,在一維數(shù)組合并時(shí)現(xiàn)在沒(méi)有增維情況,合并的結(jié)果還是一維的;在二維中,a[0]與b[0]合并存入c[0]中,a[l]與b[l]合并存入c[l]中,a、b在1號(hào)軸上被連接起來(lái)。
6) np.dstack
Dstack即deep stack,按順序深度堆疊陣列(沿第三軸),沿著第三軸(深度方向)進(jìn)行拼接。等價(jià)于np.concatenate (arr,axis=2)。除了第三個(gè)軸之外,數(shù)組的所有形狀都必須相同。一維或二維數(shù)組必須具有相同的形狀。
#coding=utf-8
import numpy as np
a=[1,2]
b=[3,4]//定義一維數(shù)組
c= np.dstack([a,b])
print(c)
a=[[1,2],[3,4]]
b=[[5,6M7,8]]//定義二維數(shù)組
c= np.dstack([a,b])
print(c)
//輸出結(jié)果:
[[[1 3][2 4刪
[[[1 5][2 6]][[3 7][4 8]]]
觀察上述程序,無(wú)論a、b是一維數(shù)組,還是二維數(shù)組,它們合并后輸出結(jié)果都變?yōu)槿S數(shù)組。原因是不管a、b是一維數(shù)組,或是二維數(shù)組,系統(tǒng)都會(huì)首先將a、b變?yōu)槿S數(shù)組,再按照2號(hào)軸進(jìn)行合并操作。先把a(bǔ)中元素追加到c中,再把b中元素追加到c中,如a[0][0][0]=1存到c[0][0][0]中b[0][0][0]=5存到c[0][0][1]中。a、b在2號(hào)軸上被連接起來(lái)。在輸出結(jié)果中,b的元素的2號(hào)軸的下標(biāo)將變大,排到a的后面,但各元素其他軸的坐標(biāo)不變。
2.4 三種語(yǔ)言在數(shù)組合并上的比較
在表1中可以發(fā)現(xiàn),在C語(yǔ)言中使用指針實(shí)現(xiàn)數(shù)組合并更好,代碼利用率更高,不受數(shù)組類型影響;在Java中數(shù)組元素個(gè)數(shù)很少時(shí),循環(huán)遍歷更好,當(dāng)數(shù)組元素個(gè)數(shù)很大時(shí),使用Sys-tem.arraycopy最好;在python中的數(shù)組合并均有相應(yīng)的方法,它的數(shù)組合并時(shí)間復(fù)雜度都為0(1),但是它所占用的內(nèi)存較為復(fù)雜。通過(guò)對(duì)比三種語(yǔ)言在數(shù)據(jù)合并中的差別,便于用戶根據(jù)實(shí)際應(yīng)用需求更加合理的選擇開(kāi)發(fā)環(huán)境以及適當(dāng)?shù)暮喜⒎椒ā?/p>
3 結(jié)束語(yǔ)
數(shù)組是計(jì)算機(jī)高級(jí)語(yǔ)言應(yīng)用最廣泛的數(shù)據(jù)結(jié)構(gòu),在程序設(shè)計(jì)中,它可以實(shí)現(xiàn)很多強(qiáng)大的功能,滿足程序設(shè)計(jì)的大量需求。本文闡述了C語(yǔ)言、Java與Python中數(shù)組合并的一些基本方法,介紹了在數(shù)組合并中不同方法的原理及實(shí)現(xiàn),并通過(guò)具體的程序?qū)嵗容^了不同語(yǔ)言在不同操作方法下的性能優(yōu)缺點(diǎn)。
參考文獻(xiàn):
[1]李興華.Java開(kāi)發(fā)實(shí)戰(zhàn)經(jīng)典[M].北京:清華大學(xué)出版社,2009.
[2]李剛.瘋狂Java講義[M].北京:電子工業(yè)出版社,2012.
[3]譚浩強(qiáng).C語(yǔ)言程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,2000.
[4]嚴(yán)蔚敏,吳偉民,數(shù)據(jù)結(jié)構(gòu)(C語(yǔ)言版)[M].北京:清華大學(xué)出版社,2010.
[5]張若愚.Python科學(xué)計(jì)算[M].北京:清華大學(xué)出版社,2012.
[6]殷人昆.數(shù)據(jù)結(jié)構(gòu):用面向?qū)ο蠓椒ㄅcC++描述[M].北京:清華大學(xué)出版社,1999.
[7] Wang P S.Java面向?qū)ο蟪绦蛟O(shè)計(jì)[M].杜一民,趙小燕,譯.北京:清華大學(xué)出版社,2003.