Numpy的基本使用
1 numpy的运算速度
用python实现的向量相加
def pythonsum(n):
a = [i for i in range(size)]
b = [i for i in range(size)]
c = []
for i in range(len(a)):
a[i] = i ** 2
b[i] = i ** 3
c.append(a[i] + b[i])
return c
用numpy实现向量相加
import numpy as np
def numpysum(n):
a = np.arange(n) ** 2
b = np.arange(n) ** 3
c = a + b
return c
两者的速度对比
import time
size = 1000
start = time.time()
c = pythonsum(size)
delta = time.time() - start
print("The last 2 elements of the sum", c[-2:])
print("time is", delta)
start = time.time()
c = numpysum(size)
delta = time.time() - start
print("The last 2 elements of the sum", c[-2:])
print("time is", delta)
输出结果:
The last 2 elements of the sum [995007996, 998001000]
time is 0.0009968280792236328
The last 2 elements of the sum [995007996 998001000]
time is 0.0
可见结果是一样的,但是numpy的运算速度远大于python实现的向量
2 numpy数组创建
函数 | 说明 |
---|---|
array | 将输入数据(列表、元祖、数组或其他序列类型)转换为ndarray,要么推断出dtype,要么显式指定dtype,默认直接复制输入数据 |
asarray | 将输入转换为ndarray,如果输入本身就是一个ndarray就不进行复制 |
arange | 类似于内置的range,但返回的是一个ndarray而不是列表 |
ones,ones_like | 根据指定的形状和dtype创建一个全1数组,ones_like以了一个数组为参数,并根据其形状和dtype创建一个全1数组 |
zeros,zeros_like | 根据指定的形状和dtype创建一个全0数组,ones_like以了一个数组为参数,并根据其形状和dtype创建一个全0数组 |
empty,empty_like | 创建新数组,只分配内存空间但不填充任何值 |
eye,identity | 创建一个正方的N * N单位矩阵(对角线为1,其余为0) |
一维数组创建
a = np.arange(5)
a.dtype # 查看数组的数据类型
# dtype('int32')
a
# array([0, 1, 2, 3, 4])
a.shape # 查看数组的维度
# (5,)
创建多维数组
创建一个维度为2,2的数组
m = np.array([np.arange(2), np.arange(2)])
m
# array([[0, 1],
# [0, 1]])
m.shape
# (2, 2)
m.dtype
# dtype('int32')
创建一个长度为10的全是0的一维数组
np.zeros(10)
# array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
创建一个维度为3,6的全是0的二位数组
np.zeros((3,6))
# array([[ 0., 0., 0., 0., 0., 0.],
# [ 0., 0., 0., 0., 0., 0.],
# [ 0., 0., 0., 0., 0., 0.]])
创建一个没有内容的,维度是2,3,2的三维数组
np.empty((2,3,2))
# array([[[ 0., 0.],
# [ 0., 0.],
# [ 0., 0.]],
#
# [[ 0., 0.],
# [ 0., 0.],
# [ 0., 0.]]])
3 选取数组元素
a = np.array([[1,2], [3,4]]) # 创建一个二维数组,内容如括号内
a
# array([[1, 2],
# [3, 4]])
a[0, 0] # 选取第一维度第一个元素的第一个元素
# 1
a[0, 1] # 选取第一维第一个元素第二个元素
# 2
a[1, 0]
# 3
a[1, 1]
# 4
4 numpy的数据类型
数据类型如表所示,如果要创建一个对应类型的数据,只需要np.数据类型(数值/数组)
np.float64(42) # 将42转化为float64类型
# 42.0
np.int8(42.0) # 转化为整数
# 42
np.bool(42) # 转化为布尔值
# True
np.bool(0) # 0的布尔值为False
# False
np.float(True) # True转化为数值则是对应类型的1
# 1.0
np.float(False) # False转化为数值则是对应类型的0
# 0.0
np.arange(7, dtype=np.uint16) # 创建数组的时候可以用dtype参数指定数据类型