Python入门 - 第 5 节课:Numpy基础

1. Nmupy处理一维数据

  • Numpy数组

  • Numpy array 与Python list的区别

《Python入门 - 第 5 节课:Numpy基础》 image.png

  • 创建Numpy数组

  1. 首先创建一个Python列表
  2. 然后调用np.array(), 将该列表作为参数, 如下面的代码示例.

示例数据

import numpy as np

# First 20 countries with employment data
countries = np.array([
    'Afghanistan', 'Albania', 'Algeria', 'Angola', 'Argentina',
    'Armenia', 'Australia', 'Austria', 'Azerbaijan', 'Bahamas',
    'Bahrain', 'Bangladesh', 'Barbados', 'Belarus', 'Belgium',
    'Belize', 'Benin', 'Bhutan', 'Bolivia',
    'Bosnia and Herzegovina'
])

# Employment data in 2007 for those 20 countries
employment = np.array([
    55.70000076,  51.40000153,  50.5       ,  75.69999695,
    58.40000153,  40.09999847,  61.5       ,  57.09999847,
    60.90000153,  66.59999847,  60.40000153,  68.09999847,
    66.90000153,  53.40000153,  48.59999847,  56.79999924,
    71.59999847,  58.40000153,  70.40000153,  41.20000076
])
  • 获取元素

print(countries[0])
print(countries[3])

Afghanistan
Angola
  • 切片

print(countries[0:3])
print(countries[:3])
print(countries[17:])
print(countries[:])

['Afghanistan' 'Albania' 'Algeria']
['Afghanistan' 'Albania' 'Algeria']
['Bhutan' 'Bolivia' 'Bosnia and Herzegovina']
['Afghanistan' 'Albania' 'Algeria' 'Angola' 'Argentina' 'Armenia'
 'Australia' 'Austria' 'Azerbaijan' 'Bahamas' 'Bahrain' 'Bangladesh'
 'Barbados' 'Belarus' 'Belgium' 'Belize' 'Benin' 'Bhutan' 'Bolivia'
 'Bosnia and Herzegovina']
  • 元素类型

print(countries.dtype)
print(employment.dtype)
print(np.array([0, 1, 2, 3]).dtype)
print(np.array([1.0, 1.5, 2.0, 2.5]).dtype)
print(np.array([True, False, True]).dtype)
print(np.array(['AL', 'AK', 'AZ', 'AR', 'CA']).dtype)

|S22 
float64
int64
float64
bool
|S2

备注: 其中S代表字符串, 22表示数组中最长的字符有22个字母

  • Looping

for country in countries:
    print('Examining country {}'.format(country))

for i in range(len(countries)):
    country = countries[i]
    country_employment = employment[i]
    print('Country {} has employment {}'.format(country,
            country_employment))
  • Numpy 常用函数

print(employment.mean())
print(employment.std())
print(employment.max())
print(employment.sum())

58.68500003850001
9.338269113687888
75.69999695
1173.70000077

备注: argmax()函数 – 返回最大值的位置

 

  • 向量化运算

这个概念来自于线性代数, 因此规则和线性代数中相同. 它和列表之间的相加不同, 如下图.

  • 向量加法

《Python入门 - 第 5 节课:Numpy基础》 image.png

  • 向量与标量相乘

规则和线性代数中相同. 它和列表与一个数字相乘不同, 列表和一个数字相乘,则会重复这个列表中的值相应的次数, 形成一个新的列表, 如下图.

《Python入门 - 第 5 节课:Numpy基础》 image.png

  • 更多的向量运算

《Python入门 - 第 5 节课:Numpy基础》 image.png

import numpy as np
a = np.array([1, 2, 3, 4])
b = np.array([1, 2, 1, 2])

print(a + b)
print(a - b)
print(a * b)
print(a / b)
print(a ** b)

[2 4 4 6]
[0 0 2 2]
[1 4 3 8]
[1 1 3 2]
[ 1  4  3 16]
a = np.array([1, 2, 3, 4])
b = 2

print(a + b)
print(a - b)
print(a * b)
print(a / b)
print(a ** b)

[3 4 5 6]
[-1  0  1  2]
[2 4 6 8]
[0 1 1 2]
[ 1  4  9 16]
a = np.array([True, True, False, False])
b = np.array([True, False, True, False])

print(a & b)
print(a | b)
print(~a)

print(a & True)
print(a & False)
               
print(a | True)
print(a | False)


[ True False False False]
[ True  True  True False]
[False False  True  True]
[ True  True False False]
[False False False False]
[ True  True  True  True]
[ True  True False False]
a = np.array([1, 2, 3, 4, 5])
b = np.array([5, 4, 3, 2, 1])

print(a > b)
print(a >= b)
print(a < b)
print(a <= b)
print(a == b)
print(a != b)

[False False False  True  True]
[False False  True  True  True]
[ True  True False False False]
[ True  True  True False False]
[False False  True False False]
[ True  True False  True  True]
a = np.array([1, 2, 3, 4])
b = 2

print(a > b)
print(a >= b)
print(a < b)
print(a <= b)
print(a == b)
print(a != b)


[False False  True  True]
[False  True  True  True]
[ True False False False]
[ True  True False False]
[False  True False False]
[ True False  True  True]

 

  • 标准化数据

为什么要对数据进行标准化?
在数据分析中, 一个常常需要回答的问题是, 某一个数据点与其他数据点相比有何取别?

例如 美国就业率与其他国家就业率的差异, 他比平均值更高还是更低? 两者相差多少?

如果要回答上述问题, 通常是将各数据点转换为相对于平均值的标准偏差值, 这叫做数据标准化.

比如2007年的就业数据, 平均就业率是58.6%, 标准偏差是10.5%, 美国就业率是62.3%, 那么美国就业率和平均就业率之间差距就是3.7%, 这约等于0.35个标准偏差, 而墨西哥2007年的平均就业率约为57.9%, 那么墨西哥就业率和平均就业率之间差距就是-0.7%, 注意, 负值表示这个值低于平均值, 正值表示高于平均值, 因此墨西哥可以转换为低于平均值0.067个标准偏差.

如何用numpy数组的向量化运算, 对一个数组中的所有值进行标准化?

代码如下:

def standardize_data(values):
'''传入一个数组. 然后用向量运算, 对该数组进行标准化'''
    standardized_values = (values - values.mean()) / values.std()
    return standardized_values

 

  • Numpy索引数组(index array)

《Python入门 - 第 5 节课:Numpy基础》 image.png

何为索引数组

对于上图中的b即为索引数组, 它将返回数组a中, 在数组b中对应为
True的元素, 因此
a[b]所返回的就是3,4,5

索引数组的三种表现形式

  1. 构建如上图所示的布尔数组
  2. 数组b也可以用另外一种形式表示b = a > 2, 然后执行a[b]
  3. 为了实现上图中结果, 还可以直接直接使用a > 2作为索引数组, 而不用赋值给b, 即a[a>2]

代码示例:

使用索引数组

import numpy as np

# Using index arrays
a = np.array([1, 2, 3, 4])
b = np.array([True, True, False, False])

print(a[b])
print(a[np.array([True, False, True, False])])


[1 2]
[1 3]

使用向量化操作创建索引数组

a = np.array([1, 2, 3, 2, 1])
b = (a >= 2)

print(a[b])
print(a[a >= 2])

[2 3 2]
[2 3 2]

在另一个数组上使用向量化操作创建索引数组

a = np.array([1, 2, 3, 4, 5])
b = np.array([1, 2, 3, 2, 1])

print(b == 2)
print(a[b == 2])

[False  True False  True False]
[2 4]

 

  • 原位与非原位

+=: 原位运算, 会将所有的新值储存在原值所在的位置, 而不是创建一个新的数组
+: 非原位运算

二者区别见下图:

《Python入门 - 第 5 节课:Numpy基础》 image.png

 
 

2. Nmupy处理二维数据

  • Numpy二维数组

  • Numpy 2D-array 与Python List of lists的区别

《Python入门 - 第 5 节课:Numpy基础》 image.png

示例数据

import numpy as np

# Subway ridership for 5 stations on 10 different days
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]
])
  • 获取元素

print(ridership[1, 3])
print(ridership[1:3, 3:5])
print(ridership[1, :])

2328

[[2328 2539]
 [6461 2691]]

[1478 3877 3674 2328 2539]
  • 向量化运算与向量化运算

print(ridership[0, :] + ridership[1, :])
print(ridership[:, 0] + ridership[:, 1])

[1478 3877 3676 2333 2539]

[   0 5355 5701 4952 6410 5509  324    2 5223 5385]
  • 2D-数组间的向量化运算

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]]

 

  • Numpy数轴

在许多情况下, 需要对列或行进行操作, 那么就需要用到数轴的知识. 比如图中所示, 每一行代表一个日期点, 每一列代表一个车站, 我们可以对每个车站求平均客流量, 当然我也可以求每天的平均客流量.

Numpy中的大多数函数都将数轴作为参数之一, 其值通常为0或1.

《Python入门 - 第 5 节课:Numpy基础》 image.png

代码示例

import numpy as np

# NumPy axis argument
a = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])

print(a.sum())
print(a.sum(axis=0))
print(a.sum(axis=1))


45
[12 15 18]
[ 6 15 24]

 

  • Numpy数据类型

  • dtype

适用于二维数组

import numpy as np
np.array([1,2,3,4,5]).dtype

dtype('int64')

,不过需要注意的数组中的每一个元素都属于同一类型, 如果为多种类型, 最终形成数组后, 都将被转换为字符串.

《Python入门 - 第 5 节课:Numpy基础》 image.png

    原文作者:IntoTheVoid
    原文地址: https://www.jianshu.com/p/02c4620b83ae
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞