最近看代碼的時候又碰到了幾個關(guān)于numpy的用法,在這里總結(jié)記錄一下,盡可能簡潔,我的上一篇關(guān)于numpy的用法是:python numpy學(xué)習(xí)總結(jié)
PS:以下官網(wǎng)對應(yīng)的都是numpy1.17版本的
一、numpy.tile()
首先,tile就是地磚,鋪磚的意思,所以這個函數(shù)就是來像一片片鋪磚貼瓦一樣,對np.ndarray數(shù)組進(jìn)行擴(kuò)展廣播。
numpy.tile(A, reps)
- 輸入數(shù)組A,reps指定沿A各個軸axis擴(kuò)展的倍數(shù),輸出矩陣維數(shù)是
max(d, A.ndim)
,其中d
是reps的長度 - 當(dāng)
d
與A.ndim
的維數(shù)不相等的時候,就把那個維數(shù)小的一方前面插入維度,值為1,然后A沿第一個軸方向到最后的軸,對應(yīng)reps里面的值進(jìn)行對應(yīng)axis的擴(kuò)展,
>>> a = np.array([0, 1, 2])
>>>> np.tile(a, 2)
array([0, 1, 2, 0, 1, 2])
>>> np.tile(a, (2, 3)) # 先把[0,1,2]升維成[[0,1,2]]
array([[0, 1, 2, 0, 1, 2, 0, 1, 2],
[0, 1, 2, 0, 1, 2, 0, 1, 2]])
>>> np.tile(a, (2, 1, 3))
array([[[0, 1, 2, 0, 1, 2, 0, 1, 2]],
[[0, 1, 2, 0, 1, 2, 0, 1, 2]]])
>>> b = np.array([[1, 2], [3, 4]])
>>> np.tile(b, (2, 1))
array([[1, 2],
[3, 4],
[1, 2],
[3, 4]])
# 注意不是下面的這個結(jié)果,即上面紅色字體提示:
# array([[1, 2],
# [1, 2],
# [3, 3],
# [3, 4]])
官網(wǎng)強烈建議使用numpy.broadcast_to來進(jìn)行廣播
二、numpy.meshgrid()
- 輸入是一些列1-D的array:x1, x2,…, xn。有幾個最后的格點網(wǎng)格就是幾維的,一般我們都是輸入x和y,所以生成的是一張二維平面的網(wǎng)格
- 有一些可選參數(shù),例如indexing : {‘xy’, ‘ij’}坐標(biāo)系
In the 2-D case with inputs of length M and N, the outputs are of shape (N, M) for ‘xy’ indexing and (M, N) for ‘ij’ indexing
,即返回的索引順序會不一樣,sparse : bool,copy : bool
>>> nx = 5
>>> ny = 3
>>> x = np.arange(nx) - (nx - 1) / 2
>>> x
array([-2., -1., 0., 1., 2.])
>>> y = np.arange(ny) - (ny - 1) / 2
>>> y
array([-1., 0., 1.])
>>> xv, yv = np.meshgrid(x, y) #默認(rèn)indexing='xy',所以輸入(5,3),輸出(3,5)
>>> xv
array([[-2., -1., 0., 1., 2.],
[-2., -1., 0., 1., 2.],
[-2., -1., 0., 1., 2.]])
>>> yv
array([[-1., -1., -1., -1., -1.],
[ 0., 0., 0., 0., 0.],
[ 1., 1., 1., 1., 1.]])
>>> xv, yv = np.meshgrid(x, y, sparse=True) # make sparse output arrays
>>> xv
array([[-2., -1., 0., 1., 2.]])
>>> yv
array([[-1.],
[ 0.],
[ 1.]])
>>> xv, yv = np.meshgrid(x, y, indexing='ij')
>>> xv
array([[-2., -2., -2.],
[-1., -1., -1.],
[ 0., 0., 0.],
[ 1., 1., 1.],
[ 2., 2., 2.]])
>>> yv
array([[-1., 0., 1.],
[-1., 0., 1.],
[-1., 0., 1.],
[-1., 0., 1.],
[-1., 0., 1.]])
三、numpy.where()
- 輸入condition,如果為真,就返回x;反之就返回y。condition, x, y要能廣播到相同的某個shape
- 但只有一個輸入?yún)?shù)condition的時候,用法如numpy.nonzero
這個函數(shù)的用法要分兩種情況:1)就是condition, x, y三個參數(shù)都給出的時候;2)只給出condition一個參數(shù)的時候,下面分情況討論:
情況1我是這樣記憶的:一維的基本挨個看滿不滿足條件,還是簡單的;多維情況下一般condition, x, y是同樣的shape的,那就element-wise的對照條件,也就返回對應(yīng)位置上的值,條件為真就返回前面那個對應(yīng)位置上的值,條件為假就返回后面那個對應(yīng)位置上的值
# 情況 1)
# [xv if c else yv
# for c, xv, yv in zip(condition, x, y)] 對于所有數(shù)組都是1-D的時候
>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.where(a < 5, a, 10*a)
array([ 0, 1, 2, 3, 4, 50, 60, 70, 80, 90])
>>> np.where([[True, False], [True, True]],
... [[1, 2], [3, 4]],
... [[9, 8], [7, 6]])
array([[1, 8],
[3, 4]])
情況2當(dāng)輸入?yún)?shù)只有condition時,返回的是滿足條件 (即非0) 元素的索引,以元組tuple的形式返回,因為返回的是索引,所以輸入condition有N維時,返回的tuple長度也就是N,看例子
# 情況 2)
>>> np.where(a > 5)
(array([3, 4], dtype=int64),)
>>> a[np.where(a > 5)]
array([6, 7])
>>> a = np.arange(8).reshape(2,2,2)
>>> a
array([[[0, 1],
[2, 3]],
[[4, 5],
[6, 7]]])
>>> np.where(a > 4)
(array([1, 1, 1], dtype=int64),
array([0, 1, 1], dtype=int64),
array([1, 0, 1], dtype=int64))
# 返回的第一列[1,0,1]位置就是5,第二列[1,1,0]就是6的位置
# 第三列[1,1,1]就是7的位置,所以就是滿足條件(非零)的索引