[一] Numpy入门
In [2]:
import numpy as np
传统计算方法与numpy比较
In [4]:
def pySum():
a = [0, 1, 2, 3, 4]
b = [5, 6, 7, 8, 9]
c = []
for i in range(len(a)):
c.append(a[i]**2 + b[i]**3)
return c
pySum()
Out[4]:
[125, 217, 347, 521, 745]
In [7]:
def npSum():
a = np.array([0, 1, 2, 3, 4])
b = np.array([5, 6, 7, 8, 9])
c = a**2 + b**3
return c
npSum()
Out[7]:
array([125, 217, 347, 521, 745], dtype=int32)
ndarray数组的属性
In [8]:
a = np.array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]])
print("ndim: {}".format(a.ndim))
print("shape: {}".format(a.shape))
print("size: {}".format(a.size))
print("dtype: {}".format(a.dtype))
print("itemsize:{}".format(a.itemsize))
Out [8]:
ndim: 2
shape: (2, 5)
size: 10
dtype: int32
itemsize:4
ndarray数组的创建
In [10]:
# x = np.array(list/array, dtype=np.uint8)
In [11]:
x = np.array([0, 1, 2, 3])
print(x)
Out[11]:
[0 1 2 3]
使用numpy中函数创建ndarray数组
In [28]:
np.arange(10)
Out[28]:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [29]:
np.ones((3, 6))
Out[29]:
array([[1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1.]])
In [30]:
np.zeros((5, 5))
Out[30]:
array([[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]])
In [31]:
np.full((3, 3), 8)
Out[31]:
array([[8, 8, 8],
[8, 8, 8],
[8, 8, 8]])
In [32]:
np.eye(5)
Out[32]:
array([[1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 1., 0.],
[0., 0., 0., 0., 1.]])
In [33]:
a = np.full((3, 3), 8)
In [21]:
np.zeros_like(a)
Out[21]:
array([[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
In [34]:
np.ones_like(a)
Out[34]:
array([[1, 1, 1],
[1, 1, 1],
[1, 1, 1]])
In [38]:
np.full_like(a.reshape(1, -1), 7)
Out[38]:
array([[7, 7, 7, 7, 7, 7, 7, 7, 7]])
In [39]:
a = np.linspace(1, 10, 4)
a
Out[39]:
array([ 1., 4., 7., 10.])
In [41]:
b = np.linspace(1, 10, 4, endpoint=False)
b
Out[41]:
array([1. , 3.25, 5.5 , 7.75])
In [43]:
c = np.concatenate((a, b))
c
Out[43]:
array([ 1. , 4. , 7. , 10. , 1. , 3.25, 5.5 , 7.75])
ndarray数组的变换
In [60]:
a = np.ones((2, 3, 4), dtype=np.int32)
a.reshape((3, 8))
Out[60]:
array([[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1]])
In [61]:
# 可以看出,reshape并不会改变原数组
a
Out[61]:
array([[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]],
[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]]])
In [62]:
c = np.ones((2, 3, 4), dtype=np.int32)
c.resize((3, 8))
In [63]:
# resize改变了原数组
c
Out[63]:
array([[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1]])
In [64]:
a.flatten()
Out[64]:
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1])
In [65]:
# flatten不改变原数组
a
Out[65]:
array([[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]],
[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]]])
使用astype改变ndarray的类型
In [67]:
a = np.ones((2, 3, 4), dtype=np.int32)
a
Out[67]:
array([[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]],
[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]]])
In [68]:
b = a.astype(np.float32)
b
Out[68]:
array([[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]],
[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]]], dtype=float32)
ndarray数组向列表进行转换(tolist)
In [69]:
a = np.full((2, 3, 4), 22, dtype=np.int32)
a
Out[69]:
array([[[22, 22, 22, 22],
[22, 22, 22, 22],
[22, 22, 22, 22]],
[[22, 22, 22, 22],
[22, 22, 22, 22],
[22, 22, 22, 22]]])
In [70]:
a.tolist()
Out[70]:
[[[22, 22, 22, 22], [22, 22, 22, 22], [22, 22, 22, 22]],
[[22, 22, 22, 22], [22, 22, 22, 22], [22, 22, 22, 22]]]
ndarray数组的索引与切片
- 索引:获取数组中特定位置元素的过程
- 切片:获取数组元素子集的过程
一维数组的索引和切片 : 与Python列表类似
In [3]:
a = np.array([9, 8, 7, 6, 5])
a[2]
Out[3]:
7
In [4]:
a[1:4:2]
Out[4]:
array([8, 6])
多维数组的索引
- 每一个维度的索引用逗号分隔
In [5]:
a = np.arange(24).reshape((2, 3, 4))
a
Out[5]:
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]]])
In [6]:
a[1, 2, 3]
Out[6]:
23
In [7]:
a[0, 1, 2]
Out[7]:
6
In [8]:
a[-1, -2, -3]
Out[8]:
17
多维数组的切片
- 单个冒号表示包括整个维度
In [13]:
a = np.arange(24).reshape((2, 3, 4))
a
Out[13]:
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]]])
In [12]:
a[:, 1, -3]
Out[12]:
array([ 5, 17])
In [14]:
a[:, 1:3, :]
Out[14]:
array([[[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[16, 17, 18, 19],
[20, 21, 22, 23]]])
In [16]:
# 多个冒号表示[start:end:stripe],此处start和end为默认值,stripe=2
a[:, :, ::2]
Out[16]:
array([[[ 0, 2],
[ 4, 6],
[ 8, 10]],
[[12, 14],
[16, 18],
[20, 22]]])
ndarray数组的运算
数组与标量之间的运算
- 数组中的每一个元素都与标量进行运算
In [21]:
a = np.arange(24).reshape((2, 3, 4))
a
Out[21]:
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]]])
In [22]:
a.mean()
Out[22]:
11.5
In [23]:
a = a / a.mean()
a
Out[23]:
array([[[0. , 0.08695652, 0.17391304, 0.26086957],
[0.34782609, 0.43478261, 0.52173913, 0.60869565],
[0.69565217, 0.7826087 , 0.86956522, 0.95652174]],
[[1.04347826, 1.13043478, 1.2173913 , 1.30434783],
[1.39130435, 1.47826087, 1.56521739, 1.65217391],
[1.73913043, 1.82608696, 1.91304348, 2. ]]])
常用的Numpy二元函数
- np.maximum(x, y, …)或np.fmax(x, y, …) : 多个数组相应位置的最大值计算
- np.minimum(x, y, …)或np.fmin(x, y, …) : 多个数组相应位置的最小值计算
- np.multuply(x, y)或 * : 两个数组相应位置相乘(不是矩阵相乘)
- np.dot(x, y) : 矩阵相乘
In [24]:
a = np.array([[5, 7, 4], [2, 7, 9], [2, 4, 3]])
a
Out[24]:
array([[5, 7, 4],
[2, 7, 9],
[2, 4, 3]])
In [25]:
b = np.array([[8, 4, 1], [6, 8, 9], [2, 6, 4]])
b
Out[25]:
array([[8, 4, 1],
[6, 8, 9],
[2, 6, 4]])
In [39]:
np.maximum(a, b)
Out[39]:
array([[8, 7, 4],
[6, 8, 9],
[2, 6, 4]])
In [35]:
np.fmax(a, b, np.zeros((3, 3)))
Out[35]:
array([[8, 7, 4],
[6, 8, 9],
[2, 6, 4]])
In [37]:
np.minimum(a, b)
Out[37]:
array([[5, 4, 1],
[2, 7, 9],
[2, 4, 3]])
In [38]:
np.fmin(a, b)
Out[38]:
array([[5, 4, 1],
[2, 7, 9],
[2, 4, 3]])
In [42]:
np.multiply(a, b)
Out[42]:
array([[40, 28, 4],
[12, 56, 81],
[ 4, 24, 12]])
In [43]:
a * b
Out[43]:
array([[40, 28, 4],
[12, 56, 81],
[ 4, 24, 12]])
In [44]:
np.dot(a, b)
Out[44]:
array([[ 90, 100, 84],
[ 76, 118, 101],
[ 46, 58, 50]])