NumPy


NumPy(Numerical Python的简称)是Python数值计算最重要的基础包。大多数提供科学计算的包都是用NumPy的数组作为构建基础。
部分功能如下:

  • ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组。
  • 用于对整组数据进行快速运算的标准数学函数(无需编写循环)
  • 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。 线性代数、随机数生成以及傅里叶变换功能
  • 用于集成由C、C++、Fortran等语言编写的代码的A C API。

数学运算

data = np.random.randn(2, 3)
print(data)

#所有元素都乘以10
print('data * 10: \n', data * 10)

#每个元素与自身相加
print('data + data : \n', data + data)

#shape(一个表示各维度大小的元组)
#dtype(一个用于说明数组数据类型的对象)
print('data shape:', data.shape)
print('data dtype:', data.dtype)

创建ndarray

#array函数
data1 = [6, 7.5, 8, 0, 1]
arr1 = np.array(data1)
print(arr1)

#嵌套序列
data2 = [[1, 2, 3, 4], [5, 6, 7, 8]]
arr2 = np.array(data2)
print(arr2)

在这里插入图片描述

数据类型

#dtype解释为特定数据类型所需的信息
arr1 = np.array([1, 2, 3], dtype=np.float64)
arr2 = np.array([1, 2, 3], dtype=np.int32)
print(arr1.dtype)
print(arr2.dtype)

在这里插入图片描述
在这里插入图片描述
数据类型的转换

  • 整数转浮点数
arr = np.array([1, 2, 3, 4, 5])
print(arr.dtype)

float_arr = arr.astype(np.float64)
print(float_arr.dtype)
  • 浮点数转整数
    浮点数转换成整数,则小数部分将会被截取删除
arr = np.array([3.7, -1.2, -2.6, 0.5, 12.9, 10.1])
print(arr)
print(arr.astype(np.int32))
  • 数字字符串转数字
numeric_strings = np.array(['1.25', '-9.6', '42'], dtype=np.string_)
print(numeric_strings.astype(float))

数组运算

arr = np.array([[1., 2., 3.], [4., 5., 6.]])
#乘
print(arr * arr)
#减
print(arr - arr)
#除
print(1 / arr)
#比较
arr2 = np.array([[0., 4., 1.], [7., 2., 12.]])
print(arr2)
print(arr2 > arr)

数组的广播

如果两个数组的维数不相同,则元素到元素的操作是不可能的。 然而,在 NumPy 中仍然可以对形状不相似的数组进行操作,因为它拥有广播功能。 较小的数组会广播到较大数组的大小,以便使它们的形状可兼容
广播规则

  1. 较小的数组会在前面追加一个长度为 1 的维度
  2. 输出数组的每个维度的大小是输入数组该维度大小的最大值
  3. 如果输入在每个维度中的大小与输出大小匹配,或其值正好为 1,则可以在计算中使用该输入
  4. 如果输入的某个维度大小为 1,则该维度中的第一个数据元素将用于该维度的所有计算

布尔型索引

names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
data = np.random.randn(7, 4)

print(names)
print(data)

[‘Bob’ ‘Joe’ ‘Will’ ‘Bob’ ‘Will’ ‘Joe’ ‘Joe’]
[[ 0.65351776 0.05222893 0.90505454 0.7626202 ]
[ 0.30115436 -0.22774645 0.86443034 1.60146854]
[-1.63004358 0.04772191 -0.22369828 0.7149201 ]
[ 0.79504143 -1.44998811 -1.78426926 0.76580967]
[-0.5974943 -0.64096068 0.39920987 0.04074823]
[ 0.38440422 1.46278306 -1.41673059 0.27833875]
[-0.76145106 -0.4296969 1.35222181 1.60042572]]
假设每个名字都对应data数组中的一行,而我们想要选出对应于名字"Bob"的所有行

print(names == 'Bob')
print(data[names == 'Bob'])

[[ 0.65351776 0.05222893 0.90505454 0.7626202 ]
[ 0.79504143 -1.44998811 -1.78426926 0.76580967]]
通过布尔型数组设置值
将data中的所有负值都设置为0

data[data < 0] = 0
print (data)

过一维布尔数组设置整行或列的值

data[names != 'Joe'] = 7
print(data)

将条件逻辑表述为数组运算

numpy.where函数是三元表达式x if condition else y的矢量化版本

#所有正值替换为2,将所有负值替换为-2
arr = np.random.randn(4, 4)
print(arr)
print(arr > 0)
print(np.where(arr > 0, 2, -2))

[[ 0.43108163 -1.62297411 -0.35272749 -0.11121756]
[ 1.09516004 -1.09607697 -1.18267922 0.41269814]
[ 0.792395 -0.15106096 -1.16765629 -0.87732462]
[ 0.36735315 0.03524087 -1.38967914 1.09297679]]
[[ True False False False]
[ True False False True]
[ True False False False]
[ True True False True]]
[[ 2 -2 -2 -2]
[ 2 -2 -2 2]
[ 2 -2 -2 -2]
[ 2 2 -2 2]]

数学和统计方法

#计算平均值
print(arr.mean())
print(np.mean(arr))
#计算行的平均值和列的和
print(arr.mean(axis=1))
print(arr.sum(axis=0))
#逐个累加和
print(arr.cumsum())

在这里插入图片描述

#布尔型数组中的True值计数
arr = np.random.randn(100)
print((arr > 0).sum())

#any用于测试数组中是否存在一个或多个True,而all则检查数组中所有值是否都是True
bools = np.array([False, False, True, False])
print(bools.any())      True
print(bools.all())      False

排序

numpy.sort()

numpy.sort(a, axis, kind, order)

a 要排序的数组
axis 沿着它排序数组的轴,如果没有数组会被展开,沿着最后的轴排序
kind 默认为’quicksort’(快速排序)
order 如果数组包含字段,则是要排序的字段

numpy.lexsort()
numpy.argsort()函数对输入数组沿给定轴执行间接排序,并使用指定排序类型返回数据的索引数组。 这个索引数组用于构造排序后的数组。

x = np.array([3,  1,  2])  
print ('我们的数组是:')  
print (x) 
print ('\n')  
print ('对 x 调用 argsort() 函数:' )
y = np.argsort(x)  
print (y) 
print ('\n')  
print ('以排序后的顺序重构原数组:')  
print (x[y])  
print ('\n')  
print ('使用循环重构原数组:')  
for i in y:  
    print (x[i])

numpy.lexsort()
函数使用键序列执行间接排序。 键可以看作是电子表格中的一列。 该函数返回一个索引数组,使用它可以获得排序数据。 注意,最后一个键恰好是 sort 的主键

唯一化以及其它的集合逻辑

names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
print(np.unique(names))

[‘Bob’ ‘Joe’ ‘Will’]

values = np.array([6, 0, 0, 3, 2, 5, 6])
print(np.in1d(values, [2, 3, 6]))

[ True False False True True False True]
在这里插入图片描述

数组的文件输入输出

#保存
arr = np.arange(10)
np.save('some_array', arr)
#加载
print(np.load('some_array.npy'))
np.savez('array_archive.npz', a=arr, b=arr)
#多个数组
np.savez('array_archive.npz', a=arr, b=arr)
arch = np.load('array_archive.npz')
print(arch['b'])
#数据压缩
np.savez_compressed('arrays_compressed.npz', a=arr, b=arr)

线性代数

#点积运算
print(x.dot(y))
print(np.dot(x, y))

numpy.linalg中有一组标准的矩阵分解运算以及诸如求逆和行列式之类的东西

from numpy.linalg import inv, qr
X = np.random.randn(5, 5)
#X和它的转置X.T的点积
mat = X.T.dot(X)
#inv转置
print(inv(mat))

在这里插入图片描述

摘自https://tianchi.aliyun.com/learn/index.html?spm=5176.100067.444.1.7ba0703ew7eSnW

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值