numpy介紹

  • numpy的數(shù)據(jù)類型
int8, uint8 - i1, u1         有/無符號的8位整型
int16, uint16 - i2, u2       有/無符號的16位整型
int32, uint32 - i4, u4       有/無符號的32位整型
int64, uint64 - i8, u8       有/無符號的64位整型
float16 - f2                 半精度浮點數(shù)
float32 - f4 or f            標準的單精度浮點數(shù),與C的float兼容。
float64 - f8 or d            標準的雙精度浮點數(shù)郑气。與C的double和Python的float兼容。
float128 - f16 or g          擴展精度浮點數(shù)
complex64/128/256 -c8/16/32  分別用兩個32位揽乱,64位或128位浮點數(shù)表示的復數(shù)名眉。
bool - ?                     存儲True和False值的布爾類型
object - O                   Python對象類型
string_ - S                  固定長度的字符串類型粟矿。S10代表長度為10的字符串。
unicode_ - U                 固定長度的unicode類型
  • 使用numpy 創(chuàng)建ndarrays
# -*- coding: utf-8 -*-
# python2.7
import numpy as np

print '使用普通一維數(shù)組生成NumPy一維數(shù)組'
data = [6, 7.5, 8, 0, 1]
arr = np.array(data)
print arr
print '打印元素類型'
print arr.dtype
print 

print '使用普通二維數(shù)組生成NumPy二維數(shù)組'
data = [[1, 2, 3, 4], [5, 6, 7, 8]]
arr = np.array(data)
print arr
print '打印數(shù)組維度'
print arr.shape
print

print '使用zeros/empty'
print np.zeros(10) # 生成包含10個0的一維數(shù)組
print np.zeros((3, 6)) # 生成3*6的二維數(shù)組
print np.empty((2, 3, 2)) # 生成2*3*2的三維數(shù)組损拢,所有元素未初始化陌粹。
print

print '使用arrange生成連續(xù)元素'
print np.arange(15)  # [0, 1, 2, ..., 14]
  • 數(shù)據(jù)類型使用以及轉換
# -*- coding: utf-8 -*-

import numpy as np

print '生成數(shù)組時指定數(shù)據(jù)類型'
arr = np.array([1, 2, 3], dtype = np.float64)
print arr.dtype
arr = np.array([1, 2, 3], dtype = np.int32)
print arr.dtype
print

print '使用astype復制數(shù)組并轉換數(shù)據(jù)類型'
int_arr = np.array([1, 2, 3, 4, 5])
float_arr = int_arr.astype(np.float)
print int_arr.dtype
print float_arr.dtype
print

print '使用astype將float轉換為int時小數(shù)部分被舍棄'
float_arr = np.array([3.7, -1.2, -2.6, 0.5, 12.9, 10.1])
int_arr = float_arr.astype(dtype = np.int)
print int_arr
print

print '使用astype把字符串轉換為數(shù)組,如果失敗拋出異常福压。'
str_arr = np.array(['1.25', '-9.6', '42'], dtype = np.string_)
float_arr = str_arr.astype(dtype = np.float)
print float_arr
print

print 'astype使用其它數(shù)組的數(shù)據(jù)類型作為參數(shù)'
int_arr = np.arange(10)
float_arr = np.array([.23, 0.270, .357, 0.44, 0.5], dtype = np.float64)
print int_arr.astype(float_arr.dtype)
print int_arr[0], int_arr[1]  # astype做了復制掏秩,數(shù)組本身不變。
  • ndarry 標量之間的計算
    ? 不用編寫循環(huán)即可對數(shù)據(jù)執(zhí)行批量運算
    ? 大小相等的數(shù)組之間的任何算術運算都會將運算應用到元素級
    ? 數(shù)組與標量的算術運算也會將那個標量值傳播到各個元素
# -*- coding: utf-8 -*-

import numpy as np

# 數(shù)組乘法/減法荆姆,對應元素相乘/相減蒙幻。
arr = np.array([[1.0, 2.0, 3.0], [4., 5., 6.]])
print arr * arr
print arr - arr
print

# 標量操作作用在數(shù)組的每個元素上
arr = np.array([[1.0, 2.0, 3.0], [4., 5., 6.]])
print 1 / arr
print arr ** 0.5  # 開根號
  • 數(shù)組索引和切片
# -*- coding: utf-8 -*-

import numpy as np

# 通過索引訪問二維數(shù)組某一行或某個元素
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print arr[2]
print arr[0][2]
print arr[0, 2] # 普通Python數(shù)組不能用。一個逗號就是一個維度的操作
print

# 對更高維數(shù)組的訪問和操作
arr = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
print arr[0]  # 結果是個2維數(shù)組
print arr[1, 0] # 結果是個1維數(shù)組
old_values = arr[0].copy()  # 復制arr[0]的值
arr[0] = 42 # 把arr[0]所有的元素都設置為同一個值
print arr
arr[0] = old_values # 把原來的數(shù)組寫回去
print arr
print

print '使用切片訪問和操作數(shù)組'
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print arr[1:6]  # 打印元素arr[1]到arr[5]
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print arr[:2] # 打印第1胆筒、2行
print arr[:2, 1:] # 打印第1邮破、2行,第2仆救、3列
print arr[:, :1]  # 打印第一列的所有元素
arr[:2, 1:] = 0 # 第1抒和、2行,第2彤蔽、3列的元素設置為0
print arr
  • NumPy的ndarray 布爾型索引
    ? 布爾型數(shù)組的長度必須跟被索引的軸長度一致摧莽。
    ? 可以將布爾型數(shù)組跟切片、整數(shù)(或整數(shù)序列)混合使用
# -*- coding: utf-8 -*-

import numpy as np
import numpy.random as np_random

print '使用布爾數(shù)組作為索引'
name_arr = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
rnd_arr = np_random.randn(7, 4) # 隨機7*4數(shù)組
print rnd_arr
print name_arr == 'Bob' # 返回布爾數(shù)組顿痪,元素等于'Bob'為True镊辕,否則False油够。
print rnd_arr[name_arr == 'Bob']  # 利用布爾數(shù)組選擇行
print rnd_arr[name_arr == 'Bob', :2]  # 增加限制打印列的范圍
print rnd_arr[~(name_arr == 'Bob')] # 對布爾數(shù)組的內(nèi)容取反
mask_arr = (name_arr == 'Bob') | (name_arr == 'Will') # 邏輯運算混合結果
print rnd_arr[mask_arr]
rnd_arr[name_arr != 'Joe'] = 7  # 先布爾數(shù)組選擇行,然后把每行的元素設置為7丑蛤。
print rnd_arr
  • 花式索引
    ? 花式索引(Fancy indexing)是一個NumPy術語叠聋,它指的是利用整數(shù)數(shù)組進
    行索引。
    ? 一次傳入多個索引數(shù)組會有一點特別受裹。它返回的是一個一維數(shù)組碌补,其中的元素
    對應各個索引元組。
# -*- coding: utf-8 -*-

import numpy as np

print 'Fancy Indexing: 使用整數(shù)數(shù)組作為索引'
arr = np.empty((8, 4))
for i in range(8):
    arr[i] = i
print arr
print arr[[4, 3, 0, 6]] # 打印arr[4]棉饶、arr[3]厦章、arr[0]和arr[6]。
print arr[[-3, -5, -7]] # 打印arr[3]照藻、arr[5]和arr[-7]行
arr = np.arange(32).reshape((8, 4))  # 通過reshape變換成二維數(shù)組
print arr[[1, 5, 7, 2], [0, 3, 1, 2]] # 打印arr[1, 0]袜啃、arr[5, 3]呆瞻,arr[7, 1]和arr[2, 2]
print arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]]  # 1572行的0312列
print arr[np.ix_([1, 5, 7, 2], [0, 3, 1, 2])] # 可讀性更好的寫法
  • NumPy的ndarray 數(shù)組轉置和軸對換
    ? 一維/二維數(shù)組轉置
    ? 高維數(shù)組軸對換
# -*- coding: utf-8 -*-

import numpy as np
import numpy.random as np_random

print '轉置矩陣'
arr = np.arange(15).reshape((3, 5))
print arr
# 設A為m×n階矩陣(即m行n列)蛾绎,第i 行j 列的元素是a(i,j),即:A=a(i,j)
# 定義A的轉置為這樣一個n×m階矩陣B链瓦,滿足B=a(j,i)发乔,即 b (i,j)=a (j,i)
# B的第i行第# j列元素是A的第j行第i列元素)熟妓,記A'=B,裝置之后shape可以從后
# 往前讀栏尚,如起愈,arr的shape為3,5,2,4,arr.T之后shape為4,2,3,5
print arr.T # 把矩陣 A 的行換成同序數(shù)的列得到的矩陣,叫做 A 的轉置矩陣
print


# 矩陣的點積:
# 兩個向量a = [a1, a2,…, an]和b = [b1, b2,…, bn]的點積定義為:
# a·b=a1b1+a2b2+……+anbn。
# 使用[矩陣乘法]并把(縱列)向量當作n×1 [矩陣]译仗,點積還可以寫為:
# a·b=a^T*b抬虽,這里的a^T指示[矩陣]a的[轉置]。
print '轉置矩陣做點積'
arr = np_random.randn(6, 3)
print np.dot(arr.T, arr)
print

print '高維矩陣轉換'
arr = np.arange(16).reshape((2, 2, 4))
print arr
'''
詳細解釋:
arr數(shù)組的內(nèi)容為
- a[0][0] = [0, 1, 2, 3]
- a[0][1] = [4, 5, 6, 7]
- a[1][0] = [8, 9, 10, 11]
- a[1][1] = [12, 13, 14, 15]
- 這是個三維數(shù)組纵菌,三個軸阐污,0,1,2,
transpose的參數(shù)為坐標咱圆,正常順序為(0, 1, 2, ... , n - 1)笛辟,
現(xiàn)在傳入的為(1, 0, 2)代表a[x][y][z] = a[y][x][z],第0個和第1個坐標互換闷堡。
- a'[0][0] = a[0][0] = [0, 1, 2, 3]
- a'[0][1] = a[1][0] = [8, 9, 10, 11]
- a'[1][0] = a[0][1] = [4, 5, 6, 7]
- a'[1][1] = a[1][1] = [12, 13, 14, 15]
arr.transpose((1,0,2))的1,0,2三個數(shù)分別代表shape()的三個數(shù)的順序隘膘,初始的
shape是(2,2,4),也就是2維的2 x 4矩陣杠览,索引分別是shape的[0],[1],[2]弯菊,
arr.transpose((1,0,2))之后,我們的索引就變成了shape[1][0][2],對應shape值是
shape(2,2,4),所以矩陣形狀不變管钳。
與此同時钦铁,我們矩陣的索引也發(fā)生了類似變化,如arr中的4才漆,索引是arr[0,1,0],arr中
的5是arr[0,1,1]牛曹,變成arr2后,4的位置應該是在[1,0,0]醇滥,5的位置變成[1,0,1]黎比,同理8
的索引從[1,0,0]變成[0,1,0]。
'''
print arr.transpose((1, 0, 2))
'''
# 轉置與交換坐標差不多鸳玩,都是關于shape以及下標的轉換阅虫,記住是兩種同時轉
# arr的shape為(2,2,4),swapaxes(1,2)之后shape變?yōu)椋?,4,2)
# 同時坐標值的變化也是一樣的不跟,比如arr[0][1][2],轉換之后它的值就為原始
# 數(shù)組的a[0][2][1],交換第一個和第二個坐標
'''
print arr.swapaxes(1, 2)  # 直接交換第1和第2個坐標
  • ndarray 快速的元素級數(shù)組函數(shù)
    • 一元函數(shù)(操作單個ndarry)
      abs, fabs: 計算整數(shù)颓帝、浮點數(shù)或復數(shù)的絕對值。對于非復數(shù)值窝革,可以使用更快的fabs购城。
      sqrt: 計算各元素的平方根。相當于arr ** 0.5
      sqare: 計算各元素的平方虐译。相當于arr ** 2
      exp: 計算各元素的e^x
      log, log10, log2, log1p :分別為自然對數(shù)瘪板、底數(shù)為10的log、底數(shù)為2的log和log(1 + x)菱蔬。
      sign: 計算各元素的正負號:1(正數(shù))篷帅、0(零)史侣、-1(負數(shù))拴泌。
      ceil :計算各元素的ceiling值,即大于等于該值的最小整數(shù)惊橱。
      floor: 計算各元素的floor值蚪腐,即小于等于該值的最小整數(shù)。
      rint :將各元素值四舍五入到最接近的整數(shù)税朴,保留dtype回季。
      modf: 將數(shù)組的小數(shù)部分與整數(shù)部分以兩個獨立數(shù)組的形式返還。
      isnan: 返回一個表示“哪些值是NaN(這不是一個數(shù)字)”的布爾型數(shù)組
      isfinite, isinf: 分別返回一個表示“哪些元素是有限的(非inf正林,非NaN)”或“哪些元素是無窮的”的布爾型數(shù)組
      cos, cosh, sin, sinh, tan, tanh: 普通型或雙曲型三角函數(shù)
      arccos, arccosh, arcsin, arcsinh,arctan, arctanh:反三角函數(shù)
      logical_not :計算各元素not x的真值泡一。相當于~arr
  • 二元函數(shù)(操作2個ndarry)
    add :將數(shù)組中對應的元素相加
    subtract: 從第一個數(shù)組中減去第二個數(shù)組中的元素
    multiply: 數(shù)組元素相乘
    divide, floor_divide: 除法或向下取整除法
    power: 對第一個數(shù)組中的元素A和第二個數(shù)組中對應位置的元素B,計算A^B觅廓。
    maximum, fmax: 元素級的最大值計算鼻忠。fmax將忽略NaN。
    minimum, fmin: 元素級的最小值計算杈绸。fmin將忽略NaN帖蔓。
    mod: 元素級的求模計算
    copysign: 將第二個數(shù)組中的符號復制給第一個數(shù)組中的值
    greater, greater_equal, less,less_equal,equal, not_equal:執(zhí)行元素級的比較矮瘟,最終產(chǎn)生布爾型數(shù)組。
    logical_and, logical_or,logical_xor:執(zhí)行元素級的真值邏輯運算塑娇,最終產(chǎn)生布爾型數(shù)組澈侠。
# -*- coding: utf-8 -*-

import numpy as np
import numpy.random as np_random

print '求平方根'
arr = np.arange(10)
print np.sqrt(arr)
print

print '數(shù)組比較'
x = np_random.randn(8)
y = np_random.randn(8)
print x
print y
print np.maximum(x, y)
print

print '使用modf函數(shù)把浮點數(shù)分解成整數(shù)和小數(shù)部分'
arr = np_random.randn(7) * 5  # 統(tǒng)一乘5
print np.modf(arr)
  • 利用ndarry進行數(shù)據(jù)處理
# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt
import numpy as np
import pylab

points = np.arange(-5, 5, 0.01) # 生成100個點
xs, ys = np.meshgrid(points, points)  # xs, ys互為轉置矩陣
print xs
print ys
z = np.sqrt(xs ** 2 + ys ** 2)
print z
# 畫圖
plt.imshow(z, cmap = plt.cm.gray);
plt.colorbar()
plt.title("Image plot of $\sqrt{x^2 + y^2}$ for a grid of values")
pylab.show() 
  • 利用ndarry進行數(shù)據(jù)處理 將條件邏輯表述為數(shù)組運算
# -*- coding: utf-8 -*-

import numpy as np
import numpy.random as np_random

'''
關于zip函數(shù)的一點解釋,zip可以接受任意多參數(shù)埋酬,然后重新組合成1個tuple列表哨啃。
zip([1, 2, 3], [4, 5, 6], [7, 8, 9])
返回結果:[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
'''
print '通過真值表選擇元素'
x_arr = np.array([1.1, 1.2, 1.3, 1.4, 1.5])
y_arr = np.array([2.1, 2.2, 2.3, 2.4, 2.5])
cond = np.array([True, False, True, True, False])
result = [(x if c else y) for x, y, c in zip(x_arr, y_arr, cond)] # 通過列表推到實現(xiàn)
print result
print np.where(cond, x_arr, y_arr)  # 使用NumPy的where函數(shù)
print

print '更多where的例子'
arr = np_random.randn(4, 4)
print arr
print np.where(arr > 0, 2, -2)
print np.where(arr > 0, 2, arr)
print

print 'where嵌套'
cond_1 = np.array([True, False, True, True, False])
cond_2 = np.array([False, True, False, True, False])
# 傳統(tǒng)代碼如下
result = []
for i in xrange(len(cond)):
    if cond_1[i] and cond_2[i]:
        result.append(0)
    elif cond_1[i]:
        result.append(1)
    elif cond_2[i]:
        result.append(2)
    else:
        result.append(3)
print result
# np版本代碼
result = np.where(cond_1 & cond_2, 0, np.where(cond_1, 1, np.where(cond_2, 2, 3)))
print result
  • 利用ndarry進行數(shù)據(jù)處理 數(shù)學和統(tǒng)計方法
    sum 對數(shù)組中全部或某軸向的元素求和。零長度的數(shù)組的sum為0写妥。
    mean 算術平均數(shù)棘催。零長度的數(shù)組的mean為NaN。
    std, var 分別為標準差和方差耳标,自由度可調(默認為n)醇坝。
    min, max 最大值和最小值
    argmin 分別為最大值和最小值的索引
    cumsum 所有元素的累計和
    cumprod 所有元素的累計積
# -*- coding: utf-8 -*-

import numpy as np
import numpy.random as np_random

print '求和,求平均'
arr = np.random.randn(5, 4)
print arr
print arr.mean()
print arr.sum()
print arr.mean(axis = 1)  # 對每一行的元素求平均
print arr.sum(0)  # 對每一列元素求和次坡,axis可以省略呼猪。
print

'''
cumsum:
- 按列操作:a[i][j] += a[i - 1][j]
- 按行操作:a[i][j] *= a[i][j - 1]
cumprod:
- 按列操作:a[i][j] += a[i - 1][j]
- 按行操作:a[i][j] *= a[i][j - 1]
'''
print 'cunsum和cumprod函數(shù)演示'
arr = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
print arr.cumsum(0)
print arr.cumprod(1)
  • 關于axis的說明
幾乎所有的數(shù)學統(tǒng)計方法都有一個axis參數(shù),軸的概念砸琅,拿sum參數(shù)來解釋
data = [[[2,4],[1,0]],[[3,4],[4,3]],[[3,4],[2,4]]]
X = np.array(data).reshape(3,2,2),shape為(3,2,2)
X的值為:
[[[2 4]
  [1 0]]

 [[3 4]
  [4 3]]

 [[3 4]
  [2 4]]]
sum(axis=0)的值為:
[[ 8 12]
 [ 7  7]]
sum(axis=2)的值為:
[[6 1]
 [7 7]
 [7 6]]
設axis=i宋距,則numpy沿著第i個下標變化的方向進行操作,從0開始。
求sum(axis=0):
根據(jù)X.shape可以知道第一軸的shape為3症脂,第一個軸的下標最大值為2谚赎,
第二軸shape為2,第二軸的最大值為1
最后一個軸的shape為2诱篷,最后一軸的最大值為1
第一個軸變化已固定壶唤,a[0][][],a[1][][],a[2][][],剩下2軸的變化,都是2個元素棕所,
所以結果是2*2個結果
第一個元素值=a[0][0][0]+a[1][0][0]+a[2][0][0]=2+3+3=8
第二個元素值=a[0][0][1]+a[1][0][1]+a[2][0][1]=4+4+4=12
第三個元素值=a[0][1][0]+a[1][1][0]+a[2][1][0]=1+4+2=7
第四個元素值=a[0][1][1]+a[1][1][1]+a[2][1][1]=0+3+4=7

求sum(axis=2):
第3個軸變化已固定闸盔,a[][][0],a[][][1],a[][][2],剩下2軸的變化,2*3就是6個結果
a[0][0][0]+a[0][0][1]=2+4=6
a[0][1][0]+a[0][1][1]=1+0=1
a[1][0][0]+a[1][0][1]=3+4=7
a[1][1][0]+a[1][1][1]=4+3=7
a[2][0][0]+a[2][0][1]=3+4=7
a[2][1][0]+a[2][1][1]=2+4=6
個人認為琳省,如果沒有理解axis的真正含義迎吵,很難熟悉的運用numpy進行數(shù)據(jù)處理
對axis總結為一句話:
設axis=i,則numpy沿著第i個下標變化的方向進行操作,從0開始针贬。
  • 使用ndarry進行數(shù)據(jù)處理 用于bool數(shù)組的方法
    ? sum對True值計數(shù)
    ? any和all測試布爾型數(shù)組击费,對于非布爾型數(shù)組,所有非0元素將會被當做True桦他。
# -*- coding: utf-8 -*-

import numpy as np
import numpy.random as np_random

print '對正數(shù)求和'
arr = np_random.randn(100)
print (arr > 0).sum() # 為true的元素的個數(shù)
print

print '對數(shù)組邏輯操作'
bools = np.array([False, False, True, False])
print bools.any() # 有一個為True則返回True
print bools.all() # 有一個為False則返回False
  • 使用ndarry進行數(shù)據(jù)處理 排序
# -*- coding: utf-8 -*-

import numpy as np
import numpy.random as np_random

print '一維數(shù)組排序'
arr = np_random.randn(8)
arr.sort()
print arr
print

print '二維數(shù)組排序'
arr = np_random.randn(5, 3)
print arr
arr.sort(1) # 對每一行元素做排序
print arr

print '找位置在5%的數(shù)字'
large_arr = np_random.randn(1000)
large_arr.sort()
print large_arr[int(0.05 * len(large_arr))]
  • 使用ndarry進行數(shù)據(jù)處理 去重以及其它集合運算
    unique(x) 計算x中的唯一元素蔫巩,并返回有序結果。
    intersect1d(x, y) 計算x和y中的公共元素,并返回有序結果批幌。
    union1d(x, y) 計算x和y的并集础锐,并返回有序結果。
    in1d(x, y) 得到一個表述"x的元素是否包含于y"的布爾型數(shù)組
    setdiff1d(x, y) 集合的差荧缘,即元素在x中且不在y中
    setxor1d(x, y) 集合的異或皆警,即存在于一個數(shù)組中但不同時存在于兩個數(shù)組中的元素。即(X+Y)-XY并集
# -*- coding: utf-8 -*-

import numpy as np
import numpy.random as np_random

print '用unique函數(shù)去重'
names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
print sorted(set(names))  # 傳統(tǒng)Python做法
print np.unique(names)
ints = np.array([3, 3, 3, 2, 2, 1, 1, 4, 4])
print np.unique(ints)
print

print '查找數(shù)組元素是否在另一數(shù)組'
values = np.array([6, 0, 0, 3, 2, 5, 6])
print np.in1d(values, [2, 3, 6])
  • ndarry的輸入輸出
    ? 將數(shù)組以二進制格式保存到磁盤
    ? 存取文本文件
# -*- coding: utf-8 -*-

import numpy as np

print '讀取csv文件做為數(shù)組'
arr = np.loadtxt('array_ex.txt', delimiter = ',')
print arr
print

print '數(shù)組文件讀寫'
arr = np.arange(10)
np.save('some_array', arr)
print np.load('some_array.npy')
print

print '多個數(shù)組壓縮存儲'
np.savez('array_archive.npz', a = arr, b = arr)
arch = np.load('array_archive.npz')
print arch['b']
  • 線性代數(shù)
    • 常用的numpy.linalg函數(shù)
      diag 以一維數(shù)組的形式返回方陣的對角線(或非對角線元素)截粗,獲將一維數(shù)組轉換
      為方陣(非對角線元素為0)信姓。
      dot 矩陣乘法
      trace 計算對角線元素的和
      det 計算矩陣行列式
      eig 計算方陣的特征值和特征向量
      inv 計算方陣的逆
      pinv 計算矩陣的Moore-Penrose偽逆
      qr 計算QR分解
      svd 計算奇異值分解
      solve 解線性方程Ax = b,其中A為一個方陣绸罗。
      lstsq 計算Ax = b的最小二乘解
    • 矩陣運算參考
# -*- coding: utf-8 -*-

import numpy as np
import numpy.random as np_random
from numpy.linalg import inv, qr

print '矩陣乘法'
'''
- 當矩陣A的列數(shù)等于矩陣B的行數(shù)時意推,A與B可以相乘。
- 矩陣C的行數(shù)等于矩陣A的行數(shù)珊蟀,C的列數(shù)等于B的列數(shù)菊值。
- 乘積C的第m行第n列的元素等于矩陣A的第m行的元素與矩陣B的第n列對應元素乘積之和。
  
'''
x = np.array([[1., 2., 3.], [4., 5., 6.]])
y = np.array([[6., 23.], [-1, 7], [8, 9]])
print x.dot(y)
print np.dot(x, np.ones(3))
x = np_random.randn(5, 5)
print

print '矩陣求逆'
mat = x.T.dot(x)
print inv(mat)  # 矩陣求逆
print mat.dot(inv(mat)) # 與逆矩陣相乘育灸,得到單位矩陣腻窒。
print

print '矩陣消元'
print mat
q, r = qr(mat)
print q
print r
# TODO: http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html q代表什么矩陣?
  • 隨機數(shù)的生成
    seed 確定隨機數(shù)生成?的種子
    permutation 返回一個序列的隨機排列或返回一個隨機排列的返回
    shuffle 對一個序列就地隨機亂序
    rand 產(chǎn)生均勻分布的樣本值
    randint 從給定的上下限范圍內(nèi)隨機選取整數(shù)
    randn 產(chǎn)生正態(tài)分布(平均值為0磅崭,標準差為1)
    binomial 產(chǎn)生二項分布的樣本值
    normal 產(chǎn)生正態(tài)(高斯)分布的樣本值
    beta 產(chǎn)生Beta分布的樣本值
    chisquare 產(chǎn)生卡方分布的樣本值
    gamma 產(chǎn)Gamma分布的樣本值
    uniform 產(chǎn)生在[0, 1]中均勻分布的樣本值
# -*- coding: utf-8 -*-

import numpy as np
import numpy.random as np_random
from random import normalvariate

print '正態(tài)分布隨機數(shù)'
samples = np.random.normal(size=(4, 4))
print samples

print '批量按正態(tài)分布生成0到1的隨機數(shù)'
N = 10
print [normalvariate(0, 1) for _ in xrange(N)]
print np.random.normal(size = N)  # 與上面代碼等價
  • 高級應用 數(shù)組重塑
    ? reshape重塑數(shù)組
    ? -1自動推導維度大小
# -*- coding: utf-8 -*-

import numpy as np

print "將一維數(shù)組轉換為二維數(shù)組"
arr = np.arange(8)
print arr.reshape((4, 2))
print arr.reshape((4, 2)).reshape((2, 4)) # 支持鏈式操作
print

print "維度大小自動推導"
arr = np.arange(15)
print arr.reshape((5, -1))
print

print "獲取維度信息并應用"
other_arr = np.ones((3, 5))
print other_arr.shape
print arr.reshape(other_arr.shape)
print

print "高維數(shù)組拉平"
arr = np.arange(15).reshape((5, 3))
print arr.ravel()

  • 高級應用 數(shù)組的拆分和合并
    concatenate 最一般化的連接儿子,沿一條軸連接一組數(shù)組
    vstack, row_stack 以面向行的方式對數(shù)組進行堆疊(沿軸0)
    hstack, 以面向行的方式對數(shù)組進行堆疊(沿軸1)
    column_stack 類似于hstack,但是會先將一維數(shù)組轉換為二維列向量砸喻。
    dstack 以面向“深度”的方式對數(shù)組進行堆疊(沿軸2)
    split 沿指定軸在指定的位置拆分數(shù)組
    hsplit, vsplit, dsplit split的便捷化函數(shù)柔逼,分別沿著軸0、軸1和軸2進行拆分割岛。
    ? _r對象
    ? _c對象
# -*- coding: utf-8 -*-

import numpy as np
import numpy.random as np_random


print '連接兩個二維數(shù)組'
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([[7, 8, 9], [10, 11, 12]])
print arr1.shape
print np.concatenate([arr1, arr2], axis = 0)  # 按行連接
print np.concatenate([arr1, arr2], axis = 1)  # 按列連接
print


# 所謂堆疊愉适,參考疊盤子。蜂桶。儡毕。連接的另一種表述
print '垂直stack與水平stack'
print np.vstack((arr1, arr2)) # 垂直堆疊
print np.hstack((arr1, arr2)) # 水平堆疊
print

print '拆分數(shù)組'
arr = np_random.randn(5, 5)
print arr
print '水平拆分'
first, second, third = np.split(arr, [1, 3], axis = 0)
print 'first'
print first
print 'second'
print second
print 'third'
print third
print '垂直拆分'
first, second, third = np.split(arr, [1, 3], axis = 1)
print 'first'
print first
print 'second'
print second
print 'third'
print third
print

# 堆疊輔助類
arr = np.arange(6)
arr1 = arr.reshape((3, 2))
arr2 = np_random.randn(3, 2)
print 'r_用于按行堆疊'
print np.r_[arr1, arr2]
print 'c_用于按列堆疊'
print np.c_[np.r_[arr1, arr2], arr]
print '切片直接轉為數(shù)組'
print np.c_[1:6, -10:-5]
  • 高級應用 元素的重復操作
    ? _tile
    ? _repeat
# -*- coding: utf-8 -*-

import numpy as np
import numpy.random as np_random

print 'Repeat: 按元素,元素級別的'
arr = np.arange(3)
print arr.repeat(3)
print arr.repeat([2, 3, 4]) # 3個元素也切,分別復制2, 3, 4次扑媚。參數(shù)元素個數(shù)和數(shù)組元素個數(shù)要匹配!
print

print 'Repeat雷恃,指定軸'
arr = np_random.randn(2, 2)
print arr
print arr.repeat(2, axis = 0) # 按行repeat
print arr.repeat(2, axis = 1) # 按列repeat
print arr.repeat(2, axis = 0) # 按行repeat
print

print 'Tile: 參考貼瓷磚疆股,數(shù)組級別的'
print np.tile(arr, 2)
print np.tile(arr, (2, 3))  # 指定每個軸的tile次數(shù)

  • 高級應用 花式索引的等價函數(shù)
    ? take
    ? put
# -*- coding: utf-8 -*-

import numpy as np
import numpy.random as np_random

print 'Fancy Indexing例子代碼'
arr = np.arange(10) * 100
inds = [7, 1, 2, 6]
print arr[inds]
print

print '使用take'
print arr.take(inds)
print

print '使用put更新內(nèi)容'
arr.put(inds, 50)
print arr
arr.put(inds, [70, 10, 20, 60])
print arr
print

print 'take,指定軸'
arr = np_random.randn(2, 4)
inds = [2, 0, 2, 1]
print arr
print arr.take(inds, axis = 1)  # 按列take
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末倒槐,一起剝皮案震驚了整個濱河市旬痹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖两残,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件永毅,死亡現(xiàn)場離奇詭異,居然都是意外死亡人弓,警方通過查閱死者的電腦和手機沼死,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來崔赌,“玉大人意蛀,你說我怎么就攤上這事〗“牛” “怎么了县钥?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長慈迈。 經(jīng)常有香客問我若贮,道長,這世上最難降的妖魔是什么痒留? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任兜看,我火速辦了婚禮,結果婚禮上狭瞎,老公的妹妹穿的比我還像新娘细移。我一直安慰自己,他們只是感情好熊锭,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布弧轧。 她就那樣靜靜地躺著,像睡著了一般碗殷。 火紅的嫁衣襯著肌膚如雪精绎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天锌妻,我揣著相機與錄音代乃,去河邊找鬼。 笑死仿粹,一個胖子當著我的面吹牛搁吓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吭历,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼堕仔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了晌区?” 一聲冷哼從身側響起摩骨,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤通贞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后恼五,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昌罩,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年灾馒,在試婚紗的時候發(fā)現(xiàn)自己被綠了峡迷。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡你虹,死狀恐怖绘搞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情傅物,我是刑警寧澤夯辖,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站董饰,受9級特大地震影響蒿褂,放射性物質發(fā)生泄漏。R本人自食惡果不足惜卒暂,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一啄栓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧也祠,春花似錦昙楚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至奖亚,卻和暖如春淳梦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背昔字。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工爆袍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人作郭。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓陨囊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親所坯。 傳聞我的和親對象是個殘疾皇子谆扎,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內(nèi)容