numpy数组(4)-二维数组
python创建二维 list 的方法是在 list 里存放 list :
l = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
numpy可以直接创建一个二维的数组:
import numpy as np l = np.array([ [1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15,16] ])
numpy二维数组获取某个值:
[a, b] : a 表示行索引, b 表示列索引,就是获取第 a 行第 b个元素
print l[1, 3] # 8
也可以截取某一部分,组成一个新的numpy数组:
print(l[1:3, 2:4]) # 取第1-3行,第2-4列的数据 # 结果: [[ 7 8] [11 12]]
也可以获取某一行或者某一列,得到一个新的一维的numpy数组:
print(l[1, :]) # 结果: [5 6 7 8]
print(l[:, 3]) # 结果: [4 8 12 16]
二维numpy数组同样有 mean() , std() 等内置方法,计算的是整个数组的所有值,无论在哪行哪列:
print(l.mean())
# 结果:
8.5
二维数组的向量化运算也是一样的:
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) b = np.array([[1, 1, 1], [2, 2, 2], [3, 3, 3]]) print (a + b) # 结果: [[ 2 3 4] [ 6 7 8] [10 11 12]]
一个综合栗子:
# 假设有如下5个地铁站10天的客流数据 ridership = np.array([ [ 0, 0, 2, 5, 0], [1478, 3877, 3674, 2328, 2539], [1613, 4088, 3991, 6461, 2691], [1560, 3392, 3826, 4787, 2613], [1608, 4802, 3932, 4477, 2705], [1576, 3933, 3909, 4979, 2685], [ 95, 229, 255, 496, 201], [ 2, 0, 1, 27, 0], [1438, 3785, 3589, 4174, 2215], [1342, 4043, 4009, 4665, 3033] ])
找出第一天里客流量最多的车站,然后返回这个车站的日平均客流,以及返回所有车站的平均日客流,作为对比:
def mean_riders_for_max_station(ridership): max_index = ridership[0, :].argmax() # 获取第一天(第0行)的最大值的索引 mean_for_max = ridership[:, max_index].mean() # 通过获取的索引,获取对应列,取平均值 overall_mean = ridership.mean() return (overall_mean, mean_for_max) print(mean_riders_for_max_station(ridership)) # 结果: (2342.6, 3239.9)
补充:
栗子中的 max_index = ridership[0, :].argmax() 也可以写成 max_index = np.argmax(ridership,axis=1)[0]
一个是数组的方法,一个是numpy的方法,其中的 axis 表示轴,后面会细讲.