python——數組的創建、存取(切片、整數、布爾)、去重、堆疊、連接

標準Python的列表(list)中,元素本質是對象。如:L = [1, 2, 3],需要3個指針和三個整數對象,對於數值運算比較浪費內存和CPU。因此,Numpy提供了ndarray(N-dimensional array object)對象:存儲單一數據類型的多維數組。

本文簡單的介紹一下python中幾種數組的創建、存取(切片、整數、布爾)、去重、堆疊、連接方法。

1、數組的創建
(1)使用numpy模塊中的array函數創建:

#通過array函數傳遞list對象
L = [1, 2, 3, 4, 5, 6]
print 'L = ', L
a = np.array(L)
print 'a = ', a
print type(a), type(L)

# 創建多維數組
b = np.array([[1, 2, 3, 4], [ 5, 6, 7, 8 ], [9, 10, 11, 12]])
print 'b = ', b
#數組屬性可以通過shpe屬性獲得
print b.shape
#強制修改shape,這裏並不是對數組進行轉置,而是改變每個軸的大小,數組元素在內存中的位置並沒有改變
b.shape = 4, 3
print b
print b.shape

# 當某個軸爲-1時,將根據數據元素的個數自動計算磁此軸的長度
b.shape = (2, -1)
print b
print b.shape
#使用reshape方法,可以創建改變尺寸的新數組,但原數組尺寸不變
c = b.reshape((4,-1))
print 'b = ', b
print 'c = ', c

# 數組b和c共享內存,修改其中一個影響另外一個
b[0][1] = 100
print 'b = \n', b
print 'c = \n', c

d = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]], dtype = np.float)
print 'd = ', d
f = d.astype(np.int)
print 'f = \n', f
print f.dtype, d.dtype
#不能對屬性強制賦值, 得到的結果將是混亂的數據
d.dtype = np.int
print '強制改變屬性:', d


(2)使用numpy中的arange、linspace、logspace、fromstring等函數創建:

#!/usr/bin/python
# -*- coding:utf-8 -*-

import numpy as np
# 如果生成一定規則的數據,可以使用NumPy專門提供的函數

# arange函數類似於Python的range函數:指定起始值,終值,步長來創建數組
# 和Python的range類似,arange不包含終值,但可以生成浮點數,而range只能是整數類型
np.set_printoptions(linewidth = 200, suppress = True)  #不換行,每行長度爲200; 輸出不使用科學計數法
a = np.arange(1, 10, 0.5)
print a
#range只能用於整數,其他情況下會出錯
#a = range(1.0, 10.0, 0.5)

# linspace函數通過指定:起始值,終值(包括),元素個數來創建數組
b = np.linspace(1, 10, 10)
print 'b = ', b
#可以使用參數endpoint來指定是否包含終值
c = np.linspace(1, 10, 10, endpoint = False)
print 'c = ', c
# 和linspace類似,logspace可以創建等比數列,默認底爲10
# 下面函數創建起始值爲10^0,終值爲10^2(包括),有10個數的等比數列
d = np.logspace(0, 2, 10, endpoint = True)
print 'd =', d
e = np.logspace(0, 2, 10, endpoint = True, base = 2)
print 'e =', e

# 使用frombuffer, fromstring, fromfile 等函數可以從字節序列創建數組
s = 'abcd'
g = np.fromstring(s, dtype = np.int8)
print 'g = ', g

2、數組的存取

(1)常規辦法:數組元素的存取方法和Python的標準方法相同

#!/usr/bin/python
# -*- coding:utf-8 -*-

import numpy as np

a = np.arange(10)
#切片,左閉右開
print 'a=', a, '  a[3:6]=', a[3:6]
#省略開始下標,表示從0開始
print 'a[:5] = ', a[:5]
#下標爲負表示從後往前數
print 'a[-3:] = ', a[-3:]
#步長爲2
print 'a[1:9:2] = ', a[1:9:2]
#步長爲-1,即翻轉
print 'a[::-1] = ', a[::-1]
# 切邊數據與原始數據共享一個內存,可以直接修改元素值
a[1:4] = 10, 20, 30
print  'a = ',a
#在實踐中要注意原始數據是否被破壞
b = a[2:5]
b[0] = 200
print 'a = ', a


(2)整數/布爾數組存取

#!/usr/bin/python
# -*- coding:utf-8 -*-

import numpy as np

#根據整數數組存取:當使用整數序列對數組元素進行存取時,
#將使用整數序列中的每個元素作爲下標, 整數序列可以是列表(list)或者數組(ndarray)
#####使用整數序列作爲下標獲得的數組不和原始數組共享數據內存#####
a = np.logspace(0, 9, 10, base = 2)
print 'a = ', a
i = np.arange(0, 10, 2)
b = a[i]
b[2] = 1.6
print 'a = ', a   #a的元素值並沒有改變,任然爲16
print 'b = ', b

#使用布爾數組i作爲下標存取數組a中的元素:返回數組a中'數組i的對應下標爲True'的所有元素
#生成10個滿足[0,1)均勻分佈的隨機數
a = np.random.rand(10)
print 'a = ', a
#大於0.5的元素索引
print '索引:', a > 0.5
#打印大於0.5的元素
b = a[a > 0.5]
print 'b = ', b
#將原素組中大於0.5的元素換成0.5
a[a > 0.5] = 0.5
print 'a = ', a
#b的值不受影響,a和b不共享內存
print 'b = ', b


(3)二維數組擴展、切片等操作

# 二維數組切片
# 當橫、縱座標都爲ndarray或list時,前後兩個數字按序形成一個二維座標,
# 此時兩個ndarray/list中元素個數必須相同
a = np.arange(0, 60, 10).reshape((-1, 1)) + np.arange(6)
print 'a = \n', a
print 'a[[0, 1, 2], [2, 3, 4]] =  ', a[[0, 1, 2], [2, 3, 4]]
#print a[[0,1], [2, 3, 4]]  # 錯誤寫法
# 其中座標位置爲數字時,表示對應的行或列,此時前後個數可以不對應
print 'a[4, [2, 3, 4]] = ', a[4, [2, 3, 4]]
print 'a[4:, [2, 3, 4]] = \n', a[4:, [2, 3, 4]]
i = np.array([True, False, False, True, True, False])
print 'a[i] = \n', a[i]
print 'a[i, 3] = ', a[i, 3]

3、數組元素去重

#一維數組去重,直接使用庫函數
a = np.array((1, 2, 3, 4, 5, 5, 7, 3, 2, 2, 8, 8))
print '原始數組:', a
b = np.unique(a)
print '去重後:', b
#二維數組的去重
c = np.array(((1,2), (3,4), (5,6), (1,3), (3,4), (6,7)))
print '原始數組:\n', c
#unique只能一維,二維會將數據展開
print '錯誤方法去重後:', np.unique(c)
#方案一:暴力法,利用set
print '去重方案一:\n', np.array(list(set((tuple(i) for i in c))))
#方案二:轉換爲虛數
x = c[:, 0] + c[:, 1] * 1j
print '方案二:轉換成虛數:\n', x
print '虛數去重後:\n', np.unique(x)
print np.unique(x, return_index = True)
idx = np.unique(x, return_index = True)[1]
print '二維數組去重後:\n', c[idx]

4、數組元素堆疊、連接
a = np.arange(1, 10).reshape(3, 3)
b = np.arange(11, 20).reshape(3, 3)
c = np.arange(101, 110).reshape(3, 3)
print 'a = \n', a
print 'b = \n', b
print 'c = \n', c
print '數組的堆疊:'
print 'axis = 0:\n', np.stack((a, b, c), axis = 0)  #最外面一層堆疊
print 'axis = 1:\n', np.stack((a, b, c), axis = 1)  #最外面第二層堆疊
print 'axis = 2:\n', np.stack((a, b, c), axis = 2)  #最外面第三層堆疊
print '數組的連接:'
print 'axis = 0:\n', np.concatenate((a, b), axis = 0)
print 'axis = 1:\n', np.concatenate((a, b), axis = 1)







發佈了37 篇原創文章 · 獲贊 88 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章