一维数组
一维数组很简单,基本和列表一致。
它们的区别在于数组切片是原始数组视图。(这就意味着,如果做任何修改,原始都会跟着修改。)
这也意味着,如果不想更改原始数组,我们需要进行显式的复制,从而得到它的副本。(.copy()
)
import numpy as np
arr = np.arange( 10)
arr
输出:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
arr[4] # 索引(注意是从0开始的)
输出:
4
arr[3:6]
输出:
array([3, 4, 5])
arr_old = arr.copy()
arr_old
输出:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
arr[3:6] = 33
arr
输出:
array([ 0, 1, 2, 33, 33, 33, 6, 7, 8, 9])
arr_old
输出:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
二维数组
二维数组中,各个索引位置上的元素不再是标量,而是一维数组。
arr1 = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])
arr1[0]
Out[13]: array([1, 2, 3])
arr1[1,2]
Out[14]: 6
多维数组
先说下reshape()
更改形状:
np.reshape(a, newshape, order='C')
np.reshape()
不更改原数组形状(会生成一个副本)
arr1 = np.arange(12)
arr2 = arr1.reshape(2,2,3) #将arr1变为2×2×3数组
arr2
Out[9]:
array([[[ 0, 1, 2],
[ 3, 4, 5]],
[[ 6, 7, 8],
[ 9, 10, 11]]])
arr2[0]
Out[10]:
array([[0, 1, 2],
[3, 4, 5]])
arr2[1]
Out[11]:
array([[ 6, 7, 8],
[ 9, 10, 11]])
arr2[0,1]
Out[12]: array([3, 4, 5])
arr2[0] = 23 #赋值
arr2
Out[15]:
array([[[23, 23, 23],
[23, 23, 23]],
[[ 6, 7, 8],
[ 9, 10, 11]]])
切片索引
那么也就可以很容易的理解下面这种索引了。
切片的索引把每一行每一列当作一个列表就可以很容易的理解。返回的都是数组。
再复杂一点:
我们想要获得下面这个数组第一行的第2,3个数值。
arr1 = np.arange(36)#创建一个一维数组。
arr2 = arr1.reshape(6,6) #更改数组形状。
Out[20]:
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],
[24, 25, 26, 27, 28, 29],
[30, 31, 32, 33, 34, 35]])
为了得到第2,3个数, 我们可以:
arr2[0,2:4]
Out[29]: array([2, 3])
我们还可以这样:
arr2[1] #取得第2行
Out[37]: array([ 6, 7, 8, 9, 10, 11])
arr2[:,3] #取得第3列, 只有:代表选取整列(也就是整个轴)
Out[38]: array([ 3, 9, 15, 21, 27, 33])
arr2[1:4,2:4] # 取得一个二维数组
Out[40]:
array([[ 8, 9],
[14, 15],
[20, 21]])
arr2[::2,::2] #设置步长为2
Out[41]:
array([[ 0, 2, 4],
[12, 14, 16],
[24, 26, 28]])
arr3 = arr2.reshape(4,3,3)
arr3[2:,:1] = 22 #对切片表达式赋值
arr3
Out[25]:
array([[[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8]],
[[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17]],
[[22, 22, 22],
[21, 22, 23],
[24, 25, 26]],
[[22, 22, 22],
[30, 31, 32],
[33, 34, 35]]])
Reference:
https://www.cnblogs.com/sunshinewang/p/6882031.html