python科学计算入门 python的科学计算_ide


之前写了一篇,求知鸟:Python科学计算:用NumPy快速处理数据

这一篇打算以另一种方式--图形,重新梳理下Numpy中的知识:

正式讲解前,先提个小问题:numpy中的运算与python自带list谁的运算速度更快?

my_arr,100000个元素,进行翻倍运算,运行10次耗时19.1ms
my_list,100000个元素,进行翻倍运算,运行10次耗时818ms,耗时是numpy的42倍!
不同的电脑配置内存,会影响最终的运算时间.


import numpy as np
my_arr = np.arange(1000000)
my_list = list(range(1000000))
%time for _ in range(10): my_arr2 = my_arr * 2
%time for _ in range(10): my_list2 = [x * 2 for x in my_list]

Wall time: 19.1 ms 
Wall time: 818 ms


所以,非常有必要学习Numpy!numpy数组明显是个很好的数据结构。


本文主讲内容:

对axis-轴的理解

一维数组的性质

二维数组的性值

数组的获取--索引与切片

对axis-轴的理解

numpy数组中的元素用的最多是「数值型」元素,平时我们说的一维、二维、三维数组长下面这个样子 (对应着线、面、体)。


python科学计算入门 python的科学计算_ide_02


绘图: http:// draw.io
还有四维数组,就是不太好画,平时也用不上!

注意一个关键字 axis,中文叫「轴」,一个数组是多少维度就有多少根轴。由于 Python 计数都是从 0 开始的,那么

  • 第 1 维度 = axis 0
  • 第 2 维度 = axis 1
  • 第 3 维度 = axis 2

但这些数组只可能在平面上打印出来,那么它们 (高于二维的数组) 的表现形式稍微有些不同。


python科学计算入门 python的科学计算_数组_03


一维数组的性质


arr


数组类型,当然是 numpy.ndarray
ndim:维度个数是 1
len():数组长度为 5 (注意这个说法只对一维数组有意义)
size:数组元素个数为 5
shape:数组形状,即每个维度的元素个数 (用元组来表示),只有一维,元素个数为 5,写成元组形式是 (5,) strides:跨度,即在某一维度下为了获取到下一个元素需要「跨过」的字节数 (用元组来表示),float64 是 8 个字节数 (bytes),因此跨度为 8
dtype: 数组元素类型,是双精度浮点 (注意和 type 区分)

strides,这个概念对于解决「转置高维数组」问题很重要。一图胜千言。


python科学计算入门 python的科学计算_ide_04


二维数组


l2 = [[1, 2, 3], [4, 5, 6]]
arr2d = np.array(l2)

print( 'The type is', type(arr2d) )
print( 'The dimension is', arr2d.ndim )
print( 'The length of array is', len(arr2d) )
print( 'The number of elements is', arr2d.size )
print( 'The shape of array is', arr2d.shape )
print( 'The stride of array is', arr2d.strides )
print( 'The type of elements is', arr2d.dtype )
#输出
The type is <class 'numpy.ndarray'>
The dimension is 2
The length of array is 2
The number of elements is 6
The shape of array is (2, 3)
The stride of array is (12, 4)
The type of elements is int32


type:数组类型 numpy.ndarray
ndim:维度个数是 2
len():数组长度为 2--行数 (严格定义 len 是数组在「轴 0」的元素个数)
size:数组元素个数为 6
shape:数组形状 (2, 3);shape[0]获得2,shape[1]获得3
strides:跨度 (12, 4) 看完下图再解释
dtype:数组元素类型 int32


python科学计算入门 python的科学计算_2d_05


数组的获取--索引与切片

一段特定位置的元素
索引是获取 一个特定位置的元素

对于一维数组 arr,

切片写法是 arr[start : stop : step]
索引写法是 arr[index]

因此,切片的操作是可以用索引操作来实现的 (一个一个总能凑成一段),只是没必要罢了。

虽然切片操作可以由多次索引操作替代,但两者最大的区别在于:

改变原数组
索引得到的是原数组的一个复制 (copy),修改索引中的内容 不会改变原数组


python科学计算入门 python的科学计算_2d_06