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 表示轴,后面会细讲.

posted @ 2018-06-27 23:04  诗&远方  阅读(6540)  评论(0编辑  收藏  举报