机器学习之Numpy 基础

numpy

Numerical Python,即数值Python包,是Python进行科学计算的一个基础包,因此要更好理解和掌握Python科学计算包,尤其是pandas,需要先行掌握NumPy库的用法。

ndarray介绍

1、ndarray:N-dimensional array, N维数组。
2、一种由相同类型的元素组成的多维数组,元素数量是事先指定好的。
3、元素的数据类型由dtype(data-type)对象来指定,每个ndarray只有一种dtype
类型
4、大小固定,创建好数组时一旦指定好大小,就不会再发生改变

ndarray属性

1、ndim 维度数量
2、shape是一个表示各维度大小的元组,即数组的形状
3、dtype,一个用于说明数组元素数据类型的对象
4、size,元素总个数,即shape中各数组相乘

ndarray的常见创建方式

1、array函数:接收一个普通的Python序列,转成ndarray
2、zeros函数:创建指定长度或形状的全零数组
3、ones函数:创建指定长度或形状的全1数组
4、empty函数:创建一个没有任何具体值的数组(准确地说是一些未初始化的垃圾
值)

ndarray的创建

import numpy as np  #首先导入numpy的包
# python列表方式创建ndarray
arr = np.array(
    [
        [
            [1, 2, 3],
            [123, 234, 456]
        ],
        [
            [5, 6, 7],
            [7, 8, 9]
        ]
    ]
)
# arry = np.array(["helloworld", "nihaoshijie", "woaipython"], dtype='|S2')
print(arr)
# 维度
print(arr.ndim)
# 形状--每个维度的数据量
print(arr.shape)
# 数组元素数据类型
print(arr.dtype)
# 元素总个数
print(arr.size)
结果如下:
[[[  1   2   3]
  [123 234 456]]

 [[  5   6   7]
  [  7   8   9]]]
3
(2, 2, 3)
int32
12
#############################分割#############################
arrzeros = np.zeros((5, 6, 4), dtype=np.int)
print(arrzeros)
arrones = np.ones((4, 5, 6), dtype=np.float)
print(arrones)
arrempty = np.empty((4, 5, 6))
print(arrempty)

##########################分割#######################################
# ndarray 其他的创建方式
# arange 类似于 range(2,20,2)2开始,到20结束,取不到20,步长为2
# linspace 生成一个等差数列np.linspace(2,20,6)第一个值代表起始位置,第二个代表结束的数
# 第三个值代表生成元素个数,最后一个值能够取到
liarr = np.linspace(2, 20, 4)
print(liarr)

# logspace 生成一个等比数列,第一个数代表102次方,第二个数代表1020次方,第三个数代表生成元素个数
logarray = np.logspace(2, 20, 3)
print(logarray)


# 小方法  arrange linspace logspace 是生成一维数组,利用reshape可以改变其维度,#reshape(n,-1-1会自动计算维度
rearray = np.arange(2, 20, 3).reshape((3, -1))
print(rearray)

# random生成随机数的一个方法
ranarray = np.random.random((2, 3, 4))  # 元组内代表维度
print(ranarray)

# random.random_sample()生成每一位随机数的方法
randomsample = np.random.random_sample()
print(randomsample)
randomsample2 = np.random.random((2, 3, 4))
print(randomsample2)



-------------------------分割--------------------------
# 数据类型 数据类型转换 astype
raarry = np.arange(3, 20, 2)
print(raarry)
print(raarry.dtype)
arr = raarry.astype(np.float)
print(arr.dtype)
# 使用unicode编码,每个元素长度为2
arr1 = arr.astype('|U2')
print(arr1)
print(arr1.dtype)

# 使用String进行编码(转换为十六进制编码)每个元素长度为2
arr2 = arr1.astype('|S2')
print(arr2)
print(arr2.dtype)

# 数据类型的转换,在声明数组的时候,定义其类型
arr3 = np.array([1, 2, 3, '4'], dtype=np.float)
print(arr3)
# 改变形状 reshape,形状是可变的,元素数量是不可变的
arr4 = np.arange(2,30,3)
print(arr4)
arr5 = arr4.reshape((2,5))
print(arr5)

# reshape不会改变原来的数据类型,但是得到的新的ndarray是原数组的视图
# 视图,改变形状后的数组里面的值改变以后原数组的值也会相应改变,多个变量指向一个内存空间
arr4[1] = 10
print(arr4)
print(arr5)
# 副本,把原来的内容重新复制了一份新的数据,放到新的内存地址空间中,修改其中一个
# 另一个不会改变。
arr6 = arr4.copy()   # 拷贝生成副本
arr4[4] = 0
print(arr4)
print(arr6)

ndarray的运算

import numpy as np
# numpy的基本操作
# 数组与标量、数组之间的运算,数组算数运算必须保证两边数组形状一致

# 加法
arr = np.arange(0, 20, 2)
print(arr)
arr1 = arr + 2  # 数组每个元素加2
print(arr1)

arr2 = arr + arr1
print(arr2)

# 减法同加法

# 乘法
arr3 = arr * arr1
print(arr3)  # 按位相乘

# 除法
arr4 = arr / arr2
print(arr4)
# arr5 = arr2/arr
# print(arr5)

arr6 = np.random.random((2,3))
arr7 = np.random.random((3,2)).reshape((2,3))
arr8 = arr6+arr7
print(arr8)


# 元素级运算
# 数据的矩阵积 数组1.dot(数组2) 第一个矩阵的列数等于等二个矩阵的行数
# 行轴(垂直的轴) xis[0],列轴(水平的轴) axis[1]
arr9 = np.random.random((3,4))
arr10 = np.random.random((4,7))
arr11 = arr9.dot(arr10)
arr12 = np.multiply(arr9,arr10)
help(np.multiply())
print(arr12)

numpy 切片

注意NumPy中通过切片得到的新数组,只是原来数组的一个视图,因此对新数组
进行操作也会影响原数组

# 在各维度上单独切片,如果某维度都保留,则直接使用 : 冒号,不指定起始值和
终止值
arr = np.array([
    [1, 2, 3],
    [2, 3, 4],
    [3, 4, 5]
])

print(arr[0])
print(arr[1, :1])
print(arr[1][1])
print(arr[1, 1])

# 三维切片,切片是一个视图
arr1 = np.random.random((2, 3, 4))
print(arr1)
print(arr1[0, 1, 0:2])
print(arr1[0][1][0:2])

# bool型索引(筛选的作用)
print(arr1 > 0.5)

# 花式索引
# ix_ np.ix_产生一个索引器
arr2 = np.arange(32).reshape((8, 4))
print(arr2)
print(arr2[[0, 3, 5], [0, 2, 3]])  # 前一个取出行,后一个按位取出对应的列
arr5 = np.arange(32).reshape((8, 4))
print(arr5[np.ix_([0, 3, 5], [0, 2, 3])])  # 前一个取出行,后一个取出每一行行中对应位置的元素

# 数据的替换
arr3 = np.array(['tom', 'price', 'python'])
print(arr3)
arr3[arr3 == 'tom'] = 1
print(arr3)

arr4 = np.array(['alace', 'python', 'nan'])
print(arr4)
arr4[arr4 == 'nan'] = 1
print(arr4)


---------------------转置------------------------------
# 转置 也是一个视图
# transpose 函数用于数组的转置
# 也可以用数组的T属性
import numpy as np

arr = np.arange(20).reshape((4, 5))
arrt = arr.T
print(arr)
print(arrt)
arrt[0, 0] = 10
print(arr)
print(arrt)
arrt2 = arrt.transpose()  # 又转置回去了
print(arrt2)

numpy 通用函数

# 通用函数
# ufunc 一种对ndarray中的数据执行元素级运算的函数,也可以看做是简单函数的矢量化包装器
# 常用的通用函数
# 一元通用函数
# abs,fabs 计算绝对值
# sqrt 开方
# square 平方
# exp 各元素取指数e的x次方
# log、log10、log2 分别为自然对数,底数是10的log,底数是2的log

arr = np.random.random((3, 4, 5))
print(arr)
print(np.abs(arr))


# np.power按位做power   x的y 次方

arr1 = np.arange(10).reshape((2,-1))
arr2 = np.arange(10).reshape((2,-1))
arr3 = np.power(arr1,arr2)
print(arr1)
print(arr2)
print(arr3)

# np.isnan 判断数组里面是否存在空值
arr4 = np.empty((2, 3, 4))
print(arr4)
arr4[0, 1, 1] = np.nan
print(arr4)
print(np.isnan(arr4))

# 二元通用函数
# np.add 相当于两个数组直接相加
# 常用的聚合函数
# 数组.max(axis = 0) 数组的最大值  axis = 0 求列的最大值,axis = 1 求行的最大值
# 数组.min() 数组的最小值
# 数组.mean() 数组的平均值
# 数组.std() 数组的标准差
arr5 = np.arange(16).reshape((4, -1))
print(arr5)
arr6 = np.random.random((4, 4))
print(arr6)
print(np.add(arr5, arr6))
arr = np.random.random((3, 5))
print(arr)
print(arr.max(axis=0))


# 三元表达式  np.where
print('true') if 2 > 3 else print('flase')
import numpy as np

# 满足True显示第一个数组中对应位置的元素
# 满足False显示第二个数组中对应位置的元素
xarr = np.array([1, 2, 3, 4, 5, 6])
yarr = np.array([1.1, 2.2, 3.3, 4.4, 5.5, 6.6])
bool_arr = np.array([True, False, False, True, False, False])
arr = zip(xarr, yarr, bool_arr)  # 将三个数组合并成一个四行三列的数组
resultarr = np.where(bool_arr, xarr, yarr)  # 表达式数组,当前表达式为True的数组,当前表达式为False的数组,其实实现数据过滤操作
result = [x if bl else y for x, y, bl in arr]  # 使用三元表达式
print(resultarr)

# np.unique函数
# 求数组中不重复的值
arr = np.array(['中国', '中国', '美国', '英国', '印度', '毛里求斯', '梵蒂冈'])
print(arr)
arr1 = np.unique(arr)
print(arr1)
# 数组文件的读取和保存
import numpy as np

# 二进制文件
# 1 np.save 写数据
# arr = np.random.random((2, 3, 4))
# np.save('datafile.txt', arr)  # 将多维数组存储到文件,自动添加后缀.npy(二进制文件)
#
# # 2 np.load 读取二进制文件,读取时候我们需要设置文件后缀
# arr2 = np.load('datafile.npy')
# print(arr2)

# 3 存取文本文件
# 3.1 读取数据的操作
arr = np.loadtxt(fname='example.csv', delimiter=',')
# # fname 文件名,dtype 文件类型,comments 注释行的符号定义,delimiter 数据分割符定义
# # skiprows 跳过行数,usecols 使用的列数
# print(arr)

# arr = np.genfromtxt('example.csv',delimiter = ',') # genfromtext 类似于loadtxt
# print(arr)

# 3.2 文件写入
# 当数组是二维以上数组,必须改变为二维数组才能存储
np.savetxt('arr.csv', arr, delimiter=',', fmt='%d')  # fmt 格式化文本
np.savetxt('arr.csv', arr.reshape((2, 6)), delimiter=',', fmt='%d')  # 也可以对数组形状进行改变
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值