numpy 軸與維度的理解
作者:liuhmmjj
原文地址:https://blog.csdn.net/u014082714/article/details/75946302
NumPy’s main object is the homogeneous multidimensional array. It is a table of elements (usually numbers), all of the same type, indexed by a tuple of positive integers. In NumPy dimensions are called axes. The number of axes is rank
For example, the coordinates of a point in 3D space [1, 2, 1] is an array of rank 1, because it has one axis. That axis has a length of 3. In the example pictured below, the array has rank 2 (it is 2-dimensional). The first dimension (axis) has a length of 2, the second dimension has a length of 3.
[[ 1., 0., 0.],
[ 0., 1., 2.]]
ndarray.ndim
陣列軸的個數,在python的世界中,軸的個數被稱作秩
-
>> X = np.reshape(np.arange(
24), (
2,
3,
4))
-
-
# 也即
2
行
3
列的
4
個平面(plane)
-
-
>> 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]]])
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
shape函式是numpy.core.fromnumeric中的函式,它的功能是讀取矩陣的長度,比如shape[0]就是讀取矩陣第一維度的長度。
shape(x)
(2,3,4)
shape(x)[0]
2
或者
x.shape[0]
2
再來分別看每一個平面的構成:
-
>>
X
[:, :,
0
]
-
array(
[[ 0, 4, 8],
-
[12, 16, 20]])
-
-
>>
X
[:, :,
1
]
-
array(
[[ 1, 5, 9],
-
[13, 17, 21]])
-
-
>>
X
[:, :,
2
]
-
array(
[[ 2, 6, 10],
-
[14, 18, 22]])
-
-
>>
X
[:, :,
3
]
-
array(
[[ 3, 7, 11],
-
[15, 19, 23]])
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
也即在對 np.arange(24)(0, 1, 2, 3, ..., 23)
進行重新的排列時,在多維陣列的多個軸的方向上,先分配最後一個軸(對於二維陣列,即先分配行的方向,對於三維陣列即先分配平面的方向)
reshpae,是陣列物件中的方法,用於改變陣列的形狀。
二維陣列
[python] view plain copy
- #!/usr/bin/env python
- # coding=utf-8
- import numpy as np
- a=np.array([1, 2, 3, 4, 5, 6, 7, 8])
- print a
- d=a.reshape((2,4))
- print d
三維陣列
[python] view plain copy
- #!/usr/bin/env python
- # coding=utf-8
- import numpy as np
- a=np.array([1, 2, 3, 4, 5, 6, 7, 8])
- print a
- f=a.reshape((2, 2, 2))
- print f
形狀變化的原則是陣列元素不能發生改變,比如這樣寫就是錯誤的,因為陣列元素髮生了變化。
[python] view plain copy
- #!/usr/bin/env python
- # coding=utf-8
- import numpy as np
- a=np.array([1, 2, 3, 4, 5, 6, 7, 8])
- print a
- print a.dtype
- e=a.reshape((2,2))
- print e
注意:通過reshape生成的新陣列和原始陣列公用一個記憶體,也就是說,假如更改一個數組的元素,另一個數組也將發生改變。
[python] view plain copy
- #!/usr/bin/env python
- # coding=utf-8
- import numpy as np
- a=np.array([1, 2, 3, 4, 5, 6, 7, 8])
- print a
- e=a.reshape((2, 4))
- print e
- a[1]=100
- print a
- print e
Python中reshape函式引數-1的意思
a=np.arange(0, 60, 10)
>>>a
array([0,10,20,30,40,50])
>>>a.reshape(-1,1)
array([[0],
[10],
[20],
[30],
[40],
[50]])
如果寫成a.reshape(1,1)就會報錯
ValueError:cannot reshape array of size 6 into shape (1,1)
>>> a = np.array([[1,2,3], [4,5,6]])
>>> np.reshape(a, (3,-1)) # the unspecified value is inferred to be 2
array([[1, 2],
[3, 4],
[5, 6]])
-1表示我懶得計算該填什麼數字,由python通過
a和其他的值
3推測出來。
# 下面是兩張2*3大小的照片(不知道有幾張照片用-1代替),如何把所有二維照片給攤平成一維
>>> image = np.array([[[1,2,3], [4,5,6]], [[1,1,1], [1,1,1]]])
>>> image.shape
(2, 2, 3)
>>> image.reshape((-1, 6))
array([[1, 2, 3, 4, 5, 6],
[1, 1, 1, 1, 1, 1]])