【Python】Numpy 笔记 1

 

 

Numpy 学习笔记

1. 多维数组对象 ndarray

In [1]:
import numpy as np
In [3]:
# 生成随机数 
data = np.random.randn(2, 3)
print(data)
 
[[-0.26128126  0.7725466  -1.47024413]
 [ 0.73682694  0.43684232  0.17994384]]
In [4]:
# ndarray 计算
# ndarray * factor
print(data * 10)
 
[[ -2.61281255   7.72546602 -14.70244135]
 [  7.36826944   4.36842317   1.7994384 ]]
In [5]:
# ndarray + ndarray
print(data + data)
tmp = np.random.randn(2, 3)
print(tmp)
print(data + tmp)
 
[[-0.52256251  1.5450932  -2.94048827]
 [ 1.47365389  0.87368463  0.35988768]]
[[-2.68377491 -0.66349224  0.77515488]
 [ 0.98361949  0.86315414 -0.59764328]]
[[-2.94505616  0.10905437 -0.69508926]
 [ 1.72044644  1.29999646 -0.41769944]]
In [6]:
# 数组大小 和 数据类型
print("data 维数:", data.shape)
print("data 元素数据类型:", data.dtype)
 
data 维数: (2, 3)
data 元素数据类型: float64
In [7]:
# 创建 ndarray
arr1 = [1, 2, 3, 4, 5, 6]
narr1 = np.array(arr1)
print(narr1)
 
[1 2 3 4 5 6]
In [8]:
arr2 = [
    [1, 2, 3, 4, 5],
    [5, 4, 3, 2, 1],
    [6, 7, 8, 9, 10]
]
narr2 = np.array(arr2)
print(narr2)
print("narr2 维数: ", narr2.shape)
print("narr2 元素类型: ", narr2.dtype)
 
[[ 1  2  3  4  5]
 [ 5  4  3  2  1]
 [ 6  7  8  9 10]]
narr2 维数:  (3, 5)
narr2 元素类型:  int64
In [11]:
# 维度 即 一维 二维 三维
print("narr2 维度:", narr2.ndim)

narr3 = np.random.randn(2, 3, 4)
print(narr3)
print("narr3 维度: ", narr3.ndim) 
 
narr2 维度: 2
[[[-0.1887431  -1.07422481  0.76851183  0.58517769]
  [-1.31747702 -0.65624169 -1.58184448  3.00727137]
  [ 1.77133723 -0.14757018 -0.02756557 -0.94413438]]

 [[-0.38033636  2.32262968 -0.32030779  2.51017579]
  [-0.07856229  0.68817178 -0.9271254  -0.07961997]
  [-0.77112293 -0.11058539  0.98678944 -0.21445142]]]
narr3 维度:  3
In [28]:
'''
zeros 创建一个元素全为 0 的 ndarray
ones 创建一个元素全为 1 的 ndarray
empty 创建一个元素值不确定的 narray
'''
print(np.zeros((2, 3)))
print(np.ones((2, 3)))
print(np.empty((2, 3, 3)))
 
[[0. 0. 0.]
 [0. 0. 0.]]
[[1. 1. 1.]
 [1. 1. 1.]]
[[[4.68170031e-310 2.41907520e-312 6.79038653e-313]
  [6.79038653e-313 2.37663529e-312 2.41907520e-312]
  [2.33419537e-312 2.35541533e-312 9.76118064e-313]]

 [[2.05833592e-312 2.12199579e-312 8.48798317e-313]
  [1.06099790e-312 6.79038653e-313 9.33678148e-313]
  [1.10343781e-312 8.70018274e-313 2.27549046e+161]]]
 

其他创建ndarray的方法

image.png

 

ndarray 元素的数据类型

In [31]:
# 使用 array 创建 ndarray 时指定元素数据类型
narr3 = np.array([1, 2, 3, 4, 5], dtype=np.float64)
print(narr3.dtype)
 
float64
In [36]:
# 使用 astype 方法进行强转
narr4 = np.array([1, 2, 3, 4])
print(narr4.dtype)
narr4 = narr4.astype(np.float64)
print(narr4)
print(narr4.dtype)
 
int64
[1. 2. 3. 4.]
float64
 

数组的运算

In [37]:
narr5 = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
print(narr5 * narr5)    # 乘法
print(narr5 - narr5)    # 减法
print(narr5 / narr5)    # 除法
print(1 / narr5)    # ?? 除法
print(narr5 / 2)    # ?? 除法
 
[[ 1  4  9 16]
 [25 36 49 64]]
[[0 0 0 0]
 [0 0 0 0]]
[[1. 1. 1. 1.]
 [1. 1. 1. 1.]]
[[1.         0.5        0.33333333 0.25      ]
 [0.2        0.16666667 0.14285714 0.125     ]]
[[0.5 1.  1.5 2. ]
 [2.5 3.  3.5 4. ]]
In [38]:
narr6 = np.array([[2, 3, 1, 4], [3, 4, 6,10]])
print(narr6 > narr5)
 
[[ True  True False False]
 [False False False  True]]
 

数组的广播

如果两个数组的维数不相同,则元素到元素的操作是不可能的。 然而,在 NumPy 中仍然可以对形状不相似的数组进行操作,因为它拥有广播功能。 较小的数组会广播到较大数组的大小,以便使它们的形状可兼容。

如果满足以下规则,可以进行广播:

ndim较小的数组会在前面追加一个长度为 1 的维度。

输出数组的每个维度的大小是输入数组该维度大小的最大值。
如果输入在每个维度中的大小与输出大小匹配,或其值正好为 1,则可以在计算中使用该输入。
如果输入的某个维度大小为 1,则该维度中的第一个数据元素将用于该维度的所有计算。
如果上述规则产生有效结果,并且满足以下条件之一,那么数组被称为可广播的。

数组拥有相同形状。

数组拥有相同的维数,每个维度拥有相同长度,或者长度为 1。
数组拥有极少的维度,可以在其前面追加长度为 1 的维度,使上述条件成立。
In [42]:
narr7 = np.array([1, 2, 3])
print("narr7: ", narr7)
narr8 = np.array([[3, 2, 1], [3, 4, 5]])
print("narr8: ", narr8)
 
narr7:  [1 2 3]
narr8:  [[3 2 1]
 [3 4 5]]
In [43]:
print(narr8 - narr7)
 
[[ 2  0 -2]
 [ 2  2  2]]
 

索引和切片

In [44]:
narr9 = np.arange(8)
print(narr9)
print(narr9[4])    # 第五个元素
 
[0 1 2 3 4 5 6 7]
4
In [45]:
# 第 5-8个元素, [4:8] 为 [4:8), narr9[4], narr9[5], narr9[6], narr9[7]
print(narr9[4:8])
 
[4 5 6 7]
In [47]:
# 集体赋值
narr9[2:5] = 10
print(narr9)
 
[ 0  1 10 10 10  5  6  7]
 

切片索引属于引用传递

将切片赋值给一个变量时,修改其中一个值,将在两个数组同时生效
In [48]:
narr10 = narr9[2:5]
print(narr10)
narr10[0] = 2333
print(narr10)
print(narr9)
 
[10 10 10]
[2333   10   10]
[   0    1 2333   10   10    5    6    7]
In [49]:
# [:] 表示所有元素
narr9[:] = 3444
print(narr9)
print(narr10)
 
[3444 3444 3444 3444 3444 3444 3444 3444]
[3444 3444 3444]
In [51]:
#对多维数组
narr11 = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
print(narr11)
print(narr11[1][3])
print(narr11[1, 3])
 
[[1 2 3 4]
 [5 6 7 8]]
8
8
In [52]:
print(narr11[1])
 
[5 6 7 8]
In [53]:
print(narr11[1, :3])
 
[5 6 7]
In [58]:
print(narr11[:1, 1:4])
 
[[2 3 4]]
 

布尔型索引

In [59]:
boolArr = np.array([True, True, False, False])
numArr = np.random.randn(4, 6)
print(boolArr)
print(numArr)
print(numArr[boolArr])
 
[ True  True False False]
[[ 1.83599786 -1.55030313  0.93297602  1.00681886 -1.30893743  0.58444773]
 [ 0.38229298 -0.15754723  1.01591674  0.18493886  0.39656789  0.77949918]
 [ 1.46401013 -0.38561406  0.39188468 -1.00582428 -1.6037673  -1.19431761]
 [-0.16030947 -1.97737712  0.38171305  1.55844943 -0.40413109  1.30287432]]
[[ 1.83599786 -1.55030313  0.93297602  1.00681886 -1.30893743  0.58444773]
 [ 0.38229298 -0.15754723  1.01591674  0.18493886  0.39656789  0.77949918]]
 

花式索引

In [63]:
narr = np.empty((6, 5))
for i in range(6):
    narr[i] = i
print(narr)
print(narr[[3, 2, 0, 5]]) # 依次输出第3、2、0、5行
 
[[0. 0. 0. 0. 0.]
 [1. 1. 1. 1. 1.]
 [2. 2. 2. 2. 2.]
 [3. 3. 3. 3. 3.]
 [4. 4. 4. 4. 4.]
 [5. 5. 5. 5. 5.]]
[[3. 3. 3. 3. 3.]
 [2. 2. 2. 2. 2.]
 [0. 0. 0. 0. 0.]
 [5. 5. 5. 5. 5.]]
 

数组转置和轴对换

In [64]:
narr = np.arange(24).reshape((4, 6))
print(narr)
print(narr.T)
 
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]
[[ 0  6 12 18]
 [ 1  7 13 19]
 [ 2  8 14 20]
 [ 3  9 15 21]
 [ 4 10 16 22]
 [ 5 11 17 23]]
In [65]:
print(np.dot(narr, narr.T))    # 计算矩阵内积
 
[[  55  145  235  325]
 [ 145  451  757 1063]
 [ 235  757 1279 1801]
 [ 325 1063 1801 2539]]
In [67]:
print(narr.transpose())
 
[[ 0  6 12 18]
 [ 1  7 13 19]
 [ 2  8 14 20]
 [ 3  9 15 21]
 [ 4 10 16 22]
 [ 5 11 17 23]]
In [69]:
# 对于高维数组,需要指定转置的轴
narr = np.arange(36).reshape((3, 4, 3))
print(narr)
print("****************** 转置后 *********************")
print(narr.transpose(1, 0, 2))
 
[[[ 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]]]
****************** 转置后 *********************
[[[ 0  1  2]
  [12 13 14]
  [24 25 26]]

 [[ 3  4  5]
  [15 16 17]
  [27 28 29]]

 [[ 6  7  8]
  [18 19 20]
  [30 31 32]]

 [[ 9 10 11]
  [21 22 23]
  [33 34 35]]]
 

元素级别通用函数

In [74]:
narr = np.arange(12).reshape((3, 4))
print(narr)
print("******** sqrt 开方 ***********")
print(np.sqrt(narr))    # 相当于 narr ** 0.5
print("******** square 平方 ***********")
print(np.square(narr))    # 相当于 narr **2
print("******** exp  ***********")
print(np.exp(narr))
print("******** maximum 取大 ***********")
narr1 = np.random.randn(3, 4)
print("narr1:", narr1)
narr2 = np.random.randn(3, 4)
print("narr2: ", narr2)

print("maximum 结果: ", np.maximum(narr1, narr2))
 
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
******** sqrt 开方 ***********
[[0.         1.         1.41421356 1.73205081]
 [2.         2.23606798 2.44948974 2.64575131]
 [2.82842712 3.         3.16227766 3.31662479]]
******** square 平方 ***********
[[  0   1   4   9]
 [ 16  25  36  49]
 [ 64  81 100 121]]
******** exp  ***********
[[1.00000000e+00 2.71828183e+00 7.38905610e+00 2.00855369e+01]
 [5.45981500e+01 1.48413159e+02 4.03428793e+02 1.09663316e+03]
 [2.98095799e+03 8.10308393e+03 2.20264658e+04 5.98741417e+04]]
******** maximum 取大 ***********
narr1: [[-0.4237138  -0.50291683 -0.2832014  -1.86529291]
 [ 1.1275772  -0.79314234 -0.18101871 -0.48041422]
 [ 1.44849666  0.08977715 -1.58754992 -1.42923501]]
narr2:  [[-0.32209496 -1.84815919  1.50079991 -1.91289155]
 [ 1.09055713 -0.67356887 -0.09820119  0.65679087]
 [-0.03926251 -0.83738628  0.09212059  0.52776944]]
maximum 结果:  [[-0.32209496 -0.50291683  1.50079991 -1.86529291]
 [ 1.1275772  -0.67356887 -0.09820119  0.65679087]
 [ 1.44849666  0.08977715  0.09212059  0.52776944]]
In [75]:
# 使用参数进行接收
print(narr)
np.square(narr, narr)
print(narr)
 
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[[  0   1   4   9]
 [ 16  25  36  49]
 [ 64  81 100 121]]
 

image.png image.png image.png

In [ ]:
 
posted @ 2020-04-09 15:49  早起的虫儿去吃鸟  阅读(196)  评论(0编辑  收藏  举报