NumPy 數(shù)組使用
# 來源:NumPy Essentials ch3
向量化
import numpy as np
# NumPy 數(shù)組的運(yùn)算是向量化的
# 數(shù)組和標(biāo)量運(yùn)算是每個(gè)元素和標(biāo)量運(yùn)算
x = np.array([1, 2, 3, 4])
x + 1
# array([2, 3, 4, 5])
# 數(shù)組和數(shù)組運(yùn)算是逐元素運(yùn)算
y = np.array([-1, 2, 3, 0])
x * y
array([-1, 4, 9, 0])
# 需要計(jì)算內(nèi)積的時(shí)候
# 使用np.dot
np.dot(x, y)
# 12
# 所有邏輯運(yùn)算符也是向量化的
x == y
# array([False, True, True, False], dtype=bool)
# NumPy 使用 C 語言編譯出來的代碼來處理數(shù)據(jù)
# 所以很快
x = np.arange(10000)
'''
%timeit x + 1
100000 loops, best of 3: 12.6 μs per loop
'''
y = range(10000)
'''
%timeit [i + 1 for i in y]
1000 loops, best of 3: 458 μs per loop
'''
x = np.arange(1,9)
x.dtype
# dtype('int32')
# 整數(shù)和浮點(diǎn)的 div 運(yùn)算生成浮點(diǎn)
x = x / 10.0
x
# array([ 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8])
x.dtype
# dtype('float64')
# 整數(shù)和浮點(diǎn)的 idiv 運(yùn)算
# 1.10 版之前生成整數(shù)
# 之后會(huì)報(bào)錯(cuò)
y = np.arange(1,9)
y /= 10.0
y
# array([0, 0, 0, 0, 0, 0, 0, 0])
y.dtype
# dtype('int32')
通用函數(shù)(ufunc)
# 通用函數(shù)在數(shù)組的每個(gè)元素上調(diào)用
# 也可以處理標(biāo)量
x = np.arange(5,10)
np.square(x)
# array([25, 36, 49, 64, 81])
# 也有二元的通用函數(shù)
y = np.ones(5) * 10
np.mod(y, x)
# array([ 0., 4., 3., 2., 1.])
# 一些函數(shù)名稱類似
# 但是效果不一樣
# np.minimum 逐元素計(jì)算較小值
# 屬于通用函數(shù)
# np.fmin 與之相同
np.minimum(x, 7)
# array([5, 6, 7, 7, 7])
# np.min 計(jì)算整個(gè)數(shù)組的最小值
# 屬于聚集函數(shù)
np.min(x)
# 5
z = np.repeat(x, 3).reshape(5, 3)
z
'''
array([[5, 5, 5],
[6, 6, 6],
[7, 7, 7],
[8, 8, 8],
[9, 9, 9]])
'''
# 聚集函數(shù)一般會(huì)有 axis 參數(shù)
# 指定沿著哪個(gè)軸
# 如果不寫浙滤,則是全數(shù)組聚集
np.median(z)
# 7.0
# 軸 0 是沿 arr[0], arr[1] 方向的軸
# 對于二維數(shù)據(jù)來說纺腊,就是列方向
np.median(z, axis = 0)
# array([ 7., 7., 7.])
# 軸 1 是沿 arr[0][0], arr[0][1] 方向的軸
# 對于二維數(shù)據(jù)來說揖膜,就是行方向
np.median(z, axis = 1)
# array([ 5., 6., 7., 8., 9.])
# accumulate 計(jì)算累計(jì)
# accum[i] = arr[0] op ... op arr[i]
np.add.accumulate(x)
array([ 5, 11, 18, 26, 35])
# outer 計(jì)算外積
# 返回矩陣壹粟,每個(gè)元素是 a[i] op b[j]
np.multiply.outer(x, x)
'''
array([[25, 30, 35, 40, 45],
[30, 36, 42, 48, 54],
[35, 42, 49, 56, 63],
[40, 48, 56, 64, 72],
[45, 54, 63, 72, 81]])
'''
廣播和調(diào)整形狀
# 最簡單的就是通過 shape 屬性調(diào)整形狀
# 形狀乘起來要等于元素個(gè)數(shù)
# -1 表示由 NumPy 來計(jì)算,這里計(jì)算結(jié)果是 4
x = np.arange(24)
x.shape = 2, 3, -1
x
'''
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
'''
# 也可以使用 reshape 生成指定形狀的視圖
# 或者 resize 生成指定形狀的副本
# 而不會(huì)改動(dòng) x
y = x.reshape((2, 3, -1))
# flatten 創(chuàng)造展開后的副本
# ravel 創(chuàng)造展開后的視圖
x = np.arange(1000000)
x.shape = 100, 100, 100
'''
%timeit x.flatten()
1000 loops, best of 3: 1.14 ms per loop
%timeit x.ravel()
1000000 loops, best of 3: 330 ns per loop
'''
向量堆疊
x = np.arange (0, 10, 2)
y = np.arange (0, -5, -1)
# vstack 是豎直堆疊犀呼,也就是沿倒數(shù)第二個(gè)軸堆疊
# 一維數(shù)組只有一個(gè)軸薇组,所以會(huì)新增一個(gè)維度
# 結(jié)果會(huì)創(chuàng)建一維數(shù)組的數(shù)組
np.vstack([x, y])
'''
array([[ 0, 2, 4, 6, 8],
[ 0, -1, -2, -3, -4]])
'''
# hstack 是數(shù)值堆疊律胀,也就是沿倒數(shù)第一個(gè)軸堆疊
# 對于一維數(shù)組是首尾拼接
np.hstack([x, y])
# array([ 0, 2, 4, 6, 8, 0, -1, -2, -3, -4])
# dstack 是縱深堆疊
# 所以結(jié)果是三維數(shù)組
np.dstack([x, y])
'''
array([[[ 0, 0],
[ 2, -1],
[ 4, -2],
[ 6, -3],
[ 8, -4]]])
'''
布爾索引
# 布爾數(shù)組可通過數(shù)組的邏輯運(yùn)算來獲取
x = np.array([1,3,-1, 5, 7, -1])
mask = (x < 0)
mask
# array([False, False, True, False, False, True], dtype=bool)
# NumPy 可接受布爾數(shù)組作為索引
# 布爾數(shù)組的形狀需要與原數(shù)組一致
# True 元素表示取該值罪佳,F(xiàn)alse 表示不取
# 結(jié)果是一維數(shù)組
x [mask] = 0
x
# array([1, 3, 0, 5, 7, 0])
# 布爾數(shù)組可以使用 sum 方法來統(tǒng)計(jì) True 的個(gè)數(shù)
# 原理是調(diào)用 sum 時(shí)會(huì)將 False 轉(zhuǎn)換成 0
# True 轉(zhuǎn)換成 1
x = np.random.random(50)
(x > .5).sum()
# 20
助手函數(shù)
# lookfor 用于搜索包含指定單詞的函數(shù)
np.lookfor('resize')
'''
Search results for 'resize'
---------------------------
numpy.ma.resize
Return a new masked array with the specified size and shape.
numpy.chararray.resize
Change shape and size of array in-place.
numpy.oldnumeric.ma.resize
The original array's total size can be any size.
numpy.resize
Return a new array with the specified shape.
'''
# 每個(gè)函數(shù)或方法的文檔字符串中
# 都包含它的 API 文檔
print np.arange.__doc__
'''
arange([start,] stop[, step,], dtype=None)
Return evenly spaced values within a given interval.
Values are generated within the half-open interval ``[start, stop)``
(in other words, the interval including `start` but excluding `stop`).
For integer arguments the function is equivalent to the Python built-in
`range <http://docs.python.org/lib/built-in-funcs.html>`_ function,
but returns an ndarray rather than a list.
...
'''