内容目录
Numpy数组广播机制¶
如果想要对列表中所有的元素都加一个数,传统方法是循环遍历整个数组进行操作。 但是numpy中的数组可以直接在数组上进行操作。
数组的运算¶
In [3]:
import numpy as np
b1 = np.random.random((3, 4))
print(b1)
# b1的所有元素都乘以10
b2 = b1 * 10
print(b2)
# 使用round让所有元素只保留2位小数
b3 = b2.round(2)
print(b3)
[[0.60054432 0.75871415 0.1024069 0.75017176] [0.46623035 0.85481774 0.64540204 0.62695452] [0.80864841 0.37535101 0.26888137 0.82027437]] [[6.00544324 7.58714147 1.02406898 7.50171762] [4.6623035 8.54817741 6.45402039 6.26954521] [8.08648411 3.75351012 2.68881369 8.20274367]] [[6.01 7.59 1.02 7.5 ] [4.66 8.55 6.45 6.27] [8.09 3.75 2.69 8.2 ]]
数组与数组的计算¶
In [5]:
import numpy as np
c1 = np.random.randint(0, 5, size=(3,6))
print(c1)
[[3 0 0 0 3 2] [2 2 3 1 0 3] [1 3 4 4 4 3]]
In [6]:
c2 = np.random.randint(1, 3, size=(3,6))
print(c2)
[[2 2 2 2 2 2] [2 1 2 1 2 2] [2 1 2 2 2 1]]
In [7]:
# c1和c2数组的行和列一致时,可以进行运算
print(c1+c2)
[[5 2 2 2 5 4] [4 3 5 2 2 5] [3 4 6 6 6 4]]
In [8]:
# 如果数组中有一方轴长为1,也是可以进行运算的
c3 = np.random.randint(0, 5, size=(3, 1))
print(c1+c3)
[[3 0 0 0 3 2] [2 2 3 1 0 3] [5 7 8 8 8 7]]
数组的叠加¶
- vstack代表在垂直方向叠加,他们的列必须一致
- hstack代表在水平方向叠加,他们的行必须一致
- concatenate需要手动指定叠加方向
垂直方向叠加 vstack¶
In [9]:
vstack1 = np.random.randint(0, 10, size=(3,4))
vstack2 = np.random.randint(0, 10, size=(1,4))
vstack3 = np.vstack([vstack1, vstack2])
print(vstack1)
print('---'*10)
print(vstack2)
print('---'*10)
print(vstack3)
[[2 1 1 8] [2 3 6 0] [9 3 5 5]] ------------------------------ [[7 3 6 1]] ------------------------------ [[2 1 1 8] [2 3 6 0] [9 3 5 5] [7 3 6 1]]
水平方向叠加 hstack¶
In [11]:
hstack1 = np.random.randint(0, 10, size=(3,4))
hstack2 = np.random.randint(0, 10, size=(3,1))
hstack3 = np.hstack([hstack1, hstack2])
print(hstack1)
print('---'*10)
print(hstack2)
print('---'*10)
print(hstack3)
[[6 8 7 3] [8 3 9 3] [3 8 4 1]] ------------------------------ [[2] [8] [5]] ------------------------------ [[6 8 7 3 2] [8 3 9 3 8] [3 8 4 1 5]]
concatenate数组叠加¶
将两个数组叠加,但是具体叠加方向看axis的参数。
- 如果axis=0,则为垂直方向(行)叠加;
- 如果axis=1,则为水平方向(列)叠加;
- 如果axis=None,那么会将两个数组合成一个一维数组
In [14]:
import numpy as np
a = np.array([[1, 2],[3, 4]])
b = np.array([[5,6]])
print(a)
print(b)
c = np.concatenate((a, b), axis=0)
print(c)
print('---'*10)
c = np.concatenate((a, b.T), axis=1)
print(c)
print('---'*10)
d = np.concatenate((a, b), axis=None)
print(d)
[[1 2] [3 4]] [[5 6]] [[1 2] [3 4] [5 6]] ------------------------------ [[1 2 5] [3 4 6]] ------------------------------ [1 2 3 4 5 6]
数组的切割¶
- hsplit是水平方向切割
- vsplit是垂直方向切割
- split需要手动指定水平方向或者垂直方向切割
水平方向切割hsplit¶
In [16]:
import numpy as np
e1 = np.arange(16).reshape(4, 4)
print(e1)
# 分割为两部分
np.hsplit(e1 , 2)
[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [12 13 14 15]]
Out[16]:
[array([[ 0, 1], [ 4, 5], [ 8, 9], [12, 13]]), array([[ 2, 3], [ 6, 7], [10, 11], [14, 15]])]
In [17]:
# 在下标为1的地方切一刀,在下标为2的地方切一刀
np.hsplit(e1 , [1,2])
Out[17]:
[array([[ 0], [ 4], [ 8], [12]]), array([[ 1], [ 5], [ 9], [13]]), array([[ 2, 3], [ 6, 7], [10, 11], [14, 15]])]
垂直方向切割hsplit¶
In [19]:
# 分割为四部分
np.vsplit(e1, 4)
Out[19]:
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]]), array([[12, 13, 14, 15]])]
In [20]:
np.vsplit(e1, (1, 3))
Out[20]:
[array([[0, 1, 2, 3]]), array([[ 4, 5, 6, 7], [ 8, 9, 10, 11]]), array([[12, 13, 14, 15]])]
split切割¶
In [22]:
# 垂直方向切割为4列
np.split(e1, 4, axis=1)
Out[22]:
[array([[ 0], [ 4], [ 8], [12]]), array([[ 1], [ 5], [ 9], [13]]), array([[ 2], [ 6], [10], [14]]), array([[ 3], [ 7], [11], [15]])]
In [23]:
# 水平方向切割为4行
np.split(e1, 4, axis=0)
Out[23]:
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]]), array([[12, 13, 14, 15]])]
数组的转置¶
In [25]:
t1 = np.random.randint(0, 9, size=(3, 6))
print(t1)
print('--'*10)
# 将t1数组进行行和列的转置
print(t1.T)
[[1 5 2 7 7 4] [0 1 2 4 7 0] [7 4 2 1 3 3]] -------------------- [[1 0 7] [5 1 4] [2 2 2] [7 4 1] [7 7 3] [4 0 3]]
In [26]:
# 使用transpose返回的是一个view,所以对返回值上进行修改会影响到原来的数组。
t2 = t1.transpose()
t2[0] = 10
print(t1)
[[10 5 2 7 7 4] [10 1 2 4 7 0] [10 4 2 1 3 3]]