NumPy高級應用
摘自《利用python進行數據分析》
ndarray對象的內部機理
ndarray內部由以下內容組成:
- 一個指向數組(一個系統內存塊)的指針。
- 數據類型dtype
- 一個表示數組形狀(shape)的元組,例如一個10X5的數組shape為(10,5)。
- 一個跨度元組(stride),其中的整數指的是為了前進到當前維度下一個元素需要跨過的位元組數。例如,一個典型的(C順序)3X4X5的float64(8個位元組)數組,其跨度為(160,40,8)
arr = np.ones((3,4,5),dtype=np.float64)arr.shape(3, 4, 5)arr.strides(160, 40, 8)
高級數組操作
數組重塑
無需複製任何數據,數組就能從一個形狀轉換為另一個形狀:只需向數組的實例方法reshape函數傳入一個表示新形狀的元組即可。
arr = np.arange(8)arr.reshape((2,4))array([[0, 1, 2, 3], [4, 5, 6, 7]])arrarray([0, 1, 2, 3, 4, 5, 6, 7])
多維數組也能被重塑。
np.arange(8).reshape((2,4)).reshape((4,2))array([[0, 1], [2, 3], [4, 5], [6, 7]])
作為參數的形狀中的其中一維可以是-1,它表示該維度的大小由數據本身推斷而來。
由於數組的shape屬性是一個元組,所以它也可以被傳入reshape函數。
與reshape相反的運算通常稱為扁平化(flattening)或散開(raveling):
arr = np.arange(15).reshape((5,3))arr.ravel()array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
如果沒有必要,ravel不會產生源數據的副本。flatten方法的行為類似於ravel,只不過它總是返回數據的副本。
Jesse comment:什麼副本不副本的,看不懂!!
數組的合併和拆分
numpy.concatenate可以按指定軸將一個由數組組成的序列(如元組,列表)連接到一起。
Jesse note:concatenate一維數組時,返回的永遠是一維數組,不會變為二維數組。
arr1 = np.array([[1,2,3],[4,5,6]])arr2 = np.array([[7,8,9],[10,11,12]])np.concatenate([arr1,arr2],axis=0)array([[ 1, 2, 3], [ 4, 5, 6], [ 7, 8, 9], [10, 11, 12]])np.concatenate([arr1,arr2],axis=1)array([[ 1, 2, 3, 7, 8, 9], [ 4, 5, 6, 10, 11, 12]])
對於常見的連接操作,NumPy提供了一些比較方便的方法。上面的運算還可以表示為:
np.vstack([arr1,arr2])array([[ 1, 2, 3], [ 4, 5, 6], [ 7, 8, 9], [10, 11, 12]])np.hstack([arr1,arr2])array([[ 1, 2, 3, 7, 8, 9], [ 4, 5, 6, 10, 11, 12]])
於此相反,split用於將一個數組沿指定軸拆分為多個數組:
numpy.split(ary, indices_or_sections, axis=0)
Split an array into multiple sub-arrays.
Parameters
ary [ndarray] Array to be divided into sub-arrays.
indices_or_sections [int or 1-D array] If indices_or_sections is an integer, N, the array will be divided into N equal arrays along axis. If such a split is not possible, an error is raised.
If indices_or_sections is a 1-D array of sorted integers, the entries indicate where along axis the array is split. For example, [2, 3] would, for axis=0, result in
? ary[:2]
? ary[2:3]
? ary[3:]
If an index exceeds the dimension of the array along axis, an empty sub-array is returned correspondingly.
axis [int, optional] The axis along which to split, default is 0.
Returns
sub-arrays [list of ndarrays] A list of sub-arrays.
Raises
ValueError If indices_or_sections is given as an integer, but a split does not result in equal division.
to be continued...
推薦閱讀: