numpy的引入
如何保存数据
- python原生数据结构支持list和dict,虽然很灵活,但空间占用率和时间效率不高。
- 类型不做限制
- 空间内可以保存不同的数据结构
- 优点是灵活,缺点是效率低
a1 = [1, 2]
a1.append('star')
a1
---------------------------------------------------------------------
结果: [1, 2, 'star']
python的array类型
- python提供了一种只能保存一种类型的数据空间结构,称之为array。
- 使用array模块进行管理
- 限制了空间里保存的数据类型大小
- 限制了灵活性,节约了空间
- 但功能非常简单,没有提供矩阵,向量类的数学运算行为
import array
b1 = array.array('L', [10, 20])
b1
---------------------------------------------------------------------
结果:array('L', [10, 20])
b1.itemsize
---------------------------------------------------------------------
结果:4
b1.append('hello')
---------------------------------------------------------------------
结果:TypeError Traceback (most recent call last)
<ipython-input-7-244121094456> in <module>
----> 1 b1.append('hello')
TypeError: an integer is required (got type str)
numpy的ndarray类
- 只能保存一种数据类型
- 支持python的list的方法
使用np.array()由python list创建
np.array(object, dtype=None, copy=True, order=‘K’, subok=False, ndmin=0)
- object : arraylike的对象,一般就是list或tuple这样的,或者暴露出_array__方法的对象,该方法返回序列对象的。
- dtype : 数据的底层存储类型,一般可设置为大小端,字节位数的限制。
- copy : 是否将object对象进行拷贝,默认为拷贝行为。
- order : 一般为"C"或"F"的底层数据存储顺序。简单说就是行优先还是列优先查找。
import numpy as np
ar1 = np.array([1, 2, 3])
注意事项:
- numpy默认ndarray的所有元素的类型是一致的
- 如果传进来的列表中包含不同的类型,则统一为同一类型,优先级:str>float>int
ar2 = np.array([1, 2, 3.], dtype='<f8')
ar2
---------------------------------------------------------------------
结果:array([1., 2., 3.])
ar2.dtype
---------------------------------------------------------------------
结果:dtype('float64')
ndarray VS List
计算的耗时问题
- 使用list和ndarray进行计算,会明显发现ndarray的速度优势。
- 但ndarray对于大数处理,就必须使用object来保存,而这样,速度优势就没有了
import random
a2 = [random.random() for i in range(10000000)]
ar3 = np.array(a2)
%%time
sum(a2)
---------------------------------------------------------------------
结果:CPU times: user 55.5 ms, sys: 988 µs, total: 56.5 ms
Wall time: 56.9 ms
5000498.110454598
%%time
ar3.sum()
---------------------------------------------------------------------
结果:CPU times: user 13.5 ms, sys: 1.7 ms, total: 15.2 ms
Wall time: 12.9 ms
5000498.110454554
ndarray的属性
基本属性
1)、shape
- 代表数组的形状,所谓的形状可以认为每个轴上有多少个数据
- 比如二维空间具有行、列的概念,假设有4行,3列的话,那么shape就是一个(4, 3)
data_list = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[10, 11, 12],
]
ar1 = np.array(data_list)
ar1
---------------------------------------------------------------------
结果:
array([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12]])
ar1.shape
---------------------------------------------------------------------
结果:(4, 3)
2)、ndim
- 代表有几个维度,或者称之为有几个轴来代表数据
ar1.ndim
---------------------------------------------------------------------
结果:2
3)、size
- 代表数组空间里元素的总个数
ar1.size
---------------------------------------------------------------------
结果:12
4)、itemsize
- 每个元素的空间大小
ar1.itemsize
---------------------------------------------------------------------
结果:8
5)、dtype
- 每个元素的数据类型
ar1.dtype
---------------------------------------------------------------------
结果: dtype('int64')