1. 程式人生 > >numpy中的tile函式的使用說明

numpy中的tile函式的使用說明

numpy中的tile函式網上講解的有很多,但大概都是一帶而過,這裡參照官方文件進行一下說明。

def tile(A, reps):
“””
Construct an array by repeating A the number of times given by reps.
If reps has length d, the result will have dimension of
max(d, A.ndim).
If A.ndim < d, A is promoted to be d-dimensional by prepending new
axes. So a shape (3,) array is promoted to (1, 3) for 2-D replication,
or shape (1, 1, 3) for 3-D replication. If this is not the desired
behavior, promote A

to d-dimensions manually before calling this
function.
If A.ndim > d, reps is promoted to A.ndim by pre-pending 1’s to it.
Thus for an A of shape (2, 3, 4, 5), a reps of (2, 2) is treated as
(1, 1, 2, 2).
Note : Although tile may be used for broadcasting, it is strongly
recommended to use numpy’s broadcasting operations and functions.
Parameters
———-
A : array_like
The input array.
reps : array_like
The number of repetitions of A
along each axis.
Returns
——-
c : ndarray
The tiled output array.

說明

如果reps為元組時很容易把人弄糊塗,網上很多都只是簡單說了一下按照維度進行復制,並沒有仔細說明,這裡詳細說明一下。
對於tile(A, reps),首先要進行A的維度和reps的長度的比較,A的維度可以用第一個左中括號到第一個右中括號之間的“[”的數目進行判定,reps的長度可以用元組中元素的個數來確定,用A.ndim和d分別表示A的維度和reps的長度,返回的是一個max(A.ndim, d)維度的陣列。
其次根據A.ndim和d的大小比較關係來進行具體的討論:

  1. A.ndim < d:返回一個d維度的陣列。因為A的維度不夠,所以需要先對A進行維度的增加,簡單來說就是在外面加中括號。A的維度擴充套件到與d的大小相同後,以維度為單位進行復制。具體規則是:元組數字從右到左,陣列維度從最深維度到最低維度。假設元組為(a,b,c,d,e,f),則陣列最深維度重複f次;然後次深維度重複e次;接著次次深維度重複d次;再然後次次次深維度重複c次…… 以此類推,直到對最低維度重複a次,結束,得到結果。
  2. A.ndim > d:返回一個與A形狀相同的陣列。因為d的長度不夠,所以需要先對元組d左側填入1,當A,d維度相同後,再參照上面的規則進行復制。
  3. A.ndim = d:從上面可以看到,當A.ndim != d時需要先讓兩者相等,然後再進行操作,再參照具體複製規則進行即可。

示例程式及講解

# -*- coding: utf-8 -*-
import numpy as np

# A.ndim = d = 1, 最深維度裡的內容是”012“,元組最右側值是2,
# 將其”乘以“2次,感覺乘要比複製好記憶,結果是[012012]
a = np.array([0, 1, 2])
arr = np.tile(a, 2)
print(np.array(arr))
# A.ndim < d:先對A增加維度,擴充套件成[[0,1,2]],然後最深層維度內容是”012“,d最右側值是2,
#故結果為[[0,1,2,0,1,2]];
# 經過上一步操作後,A的次深層維度內容是”[0,1,2,0,1,2]“,元組d次右側值為2,結果為
#[[0,1,2,0,1,2],[0,1,2,0,1,2]],可以一步步分開做,但不要忘記左右兩側的中
#括號,經過第一步就定下了維度,也就是中括號的數目和位置,
#這裡用”,“做一下分隔,實際列印是換行效果
arr = np.tile(a, (2, 2))
print(np.array(arr))

# A.ndim=1, d=3,先對A擴維成[[[0,1,2]],最深層維度內容是”012“,d最右側值是2,故結
#果為[[[0,1,2,0,1,2]]];然後次深維度內容為
# “[012012]”,d次右側值為1,結果為[[[0,1,2,0,1,2]]];
#A的第一維內容為”[[0,1,2,0,1,2]]“,d[0]為2,故結果為
# [[[0,1,2,0,1,2]],[[0,1,2,0,1,2]]]
arr = np.tile(a, (2, 1, 2))
print(np.array(arr))

# A.ndim=2, d=1,先對d左側補1,即d變為(1,2)。A的最深維內容是”1,2”和“3,4“,d的最右側值為2,對
#其分別進行”乘“操作,結果為[[1,2,1,2],[3,4,3,4]];A的次深維內容是”[1,2,1,2],[3,4,3,4]“,
#d次右側值為1,故”乘1“之後結果為
# [[1,2,1,2],[3,4,3,4]]
b = np.array([[1, 2], [3, 4]])
arr = np.tile(b, 2)
print(np.array(arr))

總結

  • tile函式使用的關鍵在於找準A的維度和reps的長度關係,然後擴充套件維度或增加元組長度,之後再像”剝洋蔥“一樣一層層的進行”複製“
  • 對於初學者,使用numpy一定要有矩陣或者向量的概念,要以此為基本單位,這於我們普通的程式設計和所學的數學中具體到某個數字式不同的