1. Nmupy处理一维数据
-
Numpy数组
-
Numpy array 与Python list的区别
-
创建Numpy数组
- 首先创建一个Python列表
- 然后调用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()函数 - 返回最大值的位置
-
向量化运算
这个概念来自于线性代数, 因此规则和线性代数中相同. 它和列表之间的相加不同, 如下图.
-
向量加法
-
向量与标量相乘
规则和线性代数中相同. 它和列表与一个数字相乘不同, 列表和一个数字相乘,则会重复这个列表中的值相应的次数, 形成一个新的列表, 如下图.
-
更多的向量运算
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)
何为索引数组
对于上图中的b即为索引数组, 它将返回数组a中, 在数组b中对应为
True
的元素, 因此a[b]
所返回的就是3,4,5
索引数组的三种表现形式
- 构建如上图所示的布尔数组
- 数组b也可以用另外一种形式表示
b = a > 2
, 然后执行a[b]
- 为了实现上图中结果, 还可以直接直接使用
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]
-
原位与非原位
+=
: 原位运算, 会将所有的新值储存在原值所在的位置, 而不是创建一个新的数组
+
: 非原位运算
二者区别见下图:
2. Nmupy处理二维数据
-
Numpy二维数组
-
Numpy 2D-array 与Python List of lists的区别
示例数据
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.
代码示例
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')
,不过需要注意的数组中的每一个元素都属于同一类型, 如果为多种类型, 最终形成数组后, 都将被转换为字符串.