Python数据挖掘基础----numpy基本用法

本篇文章将详细介绍numpy的寄出使用方法:ndarray数据类型,numpy算数运算,numpy的索引与切片,numpy的统计计算函数,以及numpy的文件操作和矩阵的基础运算

背景介绍

Numpy最重要的一个特点就是其N维数组对象(即ndarray),该对象是一个快速而灵活的大数据集容器。你可以利用这种数组对整块的数据执行一些数学运算。
ndarray是一个通用的同构数据多维容器,其中的所有元素必须是相同类型的。每个数组都有一个shape(表示各维度大小的元组)和一个dtype(表示数组数据类型的对象):

ndarray

生成ndarray对象有如下常见方法:

import numpy as np

ndarray1 = np.array([1, 2, 3, 4])
ndarray2 = np.array(list('abcdefg'))
ndarray3 = np.array([[11, 22, 33, 44], [10, 20, 30, 40]])
ndarray4=np.random.randn(2,3)
ndarray5=np.arange(15) #[0,1,2....14]
ndarray6 = np.arange(10, 20, 2) #
ndarray7 = np.arange(10, 20)

array中传入一个可迭代对象,如列表,字典,元祖
randn中传入ndarray的形状,如果只是生成一维的
arange函数里面接受(start,[end],[stp])

zeros 和zeros_like

zero用于创建数组,数组元素默认值是0. 注意:zeros_linke函数只是根据传入的ndarray数组的shape来创建所有元素为0的数组,并不是拷贝源数组中的数据.

ndarray8 = np.zeros(10)
ndarray9 = np.zeros((3, 3))
ndarray10 = np.zeros_like(ndarray5)  # 按照 ndarray5 的shape创建数组即3*3的0矩阵
ndarray11 = np.eye(5)

那么同理有全1矩阵以及空矩阵
ones,ones_like,empty,empty_like
特殊的如对角矩阵:eye,identity,用法和上面的zeros相同

numpy数组运算

不需要循环即可对数据进行批量运算,叫做矢量化运算. 不同形状的数组之间的算数运算,叫做广播,这是numpy支持的两大特性

import numpy as np
ndarray1 = np.array([1, 2, 3, 4, 5])
ndarray2 = np.array([3, 4, 5, 6, 7])

# 数组和数组之间的运算
ndarray3 = ndarray1 * ndarray2
ndarray4 = ndarray1 + ndarray2

# 数组和数字值之间的运算
ndarray5 = ndarray1 + 100
ndarray6 = 5 / ndarray1

# 多维数组和多维数组之间的运算
ndarray7 = np.arange(9).reshape((3, 3))
ndarray8 = np.arange(9).reshape((3, 3))
ndarray9 = ndarray7 + ndarray8 

# 一维数组和多维数组之间运算
ndarray10 = np.arange(3)
ndarray11 = np.arange(6).reshape((2, 3))
ndarray12 = ndarray10 + ndarray11

另外同尺寸的数组之间支持大小比较,比较方法:逐个元素比较,返回比较的bool值
不同尺寸的比较会设计到广播,后续再详细介绍

array2=np.array([0,4,1,7])
array3=np.array([1,2,8,9])
print(array2>array3)

索引与切片

numpy索引分为bool索引和神奇索引,所谓bool索引即通过bool值输出对应的行列,如下:

import numpy as np

names=np.array(["BB","JE","WL","BB","WL","JE","JE"])
data=np.arange(28).reshape(7,4)
# 输出第0,3行
print(data[names=="BB"])

补充:在numpy中取反可以用!=和~,多个条件连用时可以选择逻辑运算符,在numpy中没有and和or,取而代之的是& 和 |,使用bool索引时生成的是数据的拷贝
神奇索引:简而言之就是通过传递索引数组进行取值,常见用法如下:

import numpy as np
ndarray1 = np.empty((8, 4))
for i in range(8):
    ndarray1[i] = np.arange(i, i + 4)
print(ndarray1)
# 输出第0,1,6,7行
ret1 = ndarray1[[0, 1, 6, 7]]

# 输出倒数第一,第0,倒数第二行
ret2 = ndarray1[[-1, 0, -2]]

# 分别输出(1,1),(3,2),(5,3)
ret3 = ndarray1[[1, 3, 5], [1, 2, 3]]
#第一行第一列,第三行第二列
ret4 = ndarray1[[1, 3, 5]][[1, 2]]
# [(1,1),(1,2),(1,3),(3,1),(3,2),(3,3),(5,1),(5,2),(5,3)]
ret5 = ndarray1[[1, 3, 5]][:, [1, 2, 3]]
ret6 = ndarray1[np.ix_([1, 2, 4], [1, 2, 3])]

numpy的转置也很简单,如ndarray1.T

numpy的where用法见如下列子:取出两个数组当中较大的元素

import numpy as np

ndarray1 = np.array([6, 7, 8, 6, 8, 3, 4, 5, 8, 7])
ndarray2 = np.array([3, 5, 3, 7, 2, 1, 2, 2, 7, 4])
result1 = [ n1 if c else n2 for n1, n2, c in zip(ndarray1, ndarray2, ndarray1 > ndarray2) ]
result2 = np.where(ndarray1 > ndarray2, ndarray1, ndarray2)

where使用格式为: result = np.where(条件, 值1, 值2),即条件成立则取值1,否则取值2

numpy通用函数

常见的通用函数见下表:
Python数据挖掘基础----numpy基本用法_第1张图片
Python数据挖掘基础----numpy基本用法_第2张图片
常见函数的使用方法:

一元函数使用方法:
import numpy as np
ndarray1 = np.array([3.5, 1.7, 2.2, -7.8, np.nan, 4.6, -3.4])
# abs	计算整数、浮点数的绝对值。
np.abs(ndarray1)
# aqrt	计算各元素的平方根。相当于arr ** 0.5
np.square(ndarray1)
# sign	计算各元素的正负号,1(正数)、0(零)、-1(负数)
np.sign(ndarray1)
二元函数使用方法:
ndarray2 = np.random.randint(1, 20, (4, 5))
ndarray3 = np.random.randint(-10, 10, (4, 5))
ndarray3 = np.where(ndarray3 == 0, 1, ndarray3)

# add	将数组中对应的元素相加.
np.add(ndarray2, ndarray3)
# subtract	从第一个数组中减去第二个数组中的元素.
np.subtract(ndarray2, ndarray3)
# maximum、fmax	从两个数组中取出最大值。fmax将忽略NaN
np.maximum(ndarray2, ndarray3)
# greater、greater_equal	执行元素级的运算比较,最终产生布尔类型数组。
np.greater(ndarray2, ndarray3)

numpy数组统计函数

Python数据挖掘基础----numpy基本用法_第3张图片
使用方法如下:

import numpy as np
ndarray1 = np.random.randint(1, 10, (4, 5))


# 0-列 1-行
# sum-计算所有元素和
np.sum(ndarray1)



# sum-计算每一列的元素和
np.sum(ndarray1, axis=0)
# sum-计算每一行的元素和
np.sum(ndarray1, axis=1)



# argmax-默认情况下按照一维数组索引,返回最大元素的索引位置
np.argmax(ndarray1)
# argmax-统计每一列最大
np.argmax(ndarray1, axis=0)
# argmax-统计每一行最大
np.argmax(ndarray1, axis=1)



# mean-求所有元素的平均值
np.mean(ndarray1)
# mean-求每一列元素的平均值
np.mean(ndarray1, axis=0)
# mean-求每一行元素的平均值
np.mean(ndarray1, axis=1)

**all和any函数:**比较两个ndarray对象是否相等,如果用all函数,那么当且仅当两对象所有元素都相等时才返回true,如果用any那么当两对象中有任一元素相等即返回true

添加和删除函数

Python数据挖掘基础----numpy基本用法_第4张图片使用方法:

import numpy as np

ndarray1 = np.arange(4)
ndarray2 = np.arange(4)
ndarray3 = np.arange(12).reshape((3, 4))
np.append(ndarray1, 100)#数组中追加一个元素
np.append(ndarray1, ndarray2)#一维数组后再追加一个一维数组
# append总是返回一维数组

np.concatenate((ndarray1, ndarray2))
np.concatenate((ndarray3, ndarray4), axis=0)#默认是按照行来合并
np.concatenate((ndarray3, ndarray4), axis=1)#按照列来合并
np.delete(ndarray5, 0, axis=0)# 删除第0行元素
np.delete(ndarray5, [0, 2, 3], axis=1)#删除第0,2,3列元素
np.insert(ndarray6, 2, [10, 20])#在第2个位置插入10,20
np.insert(ndarray6, 1, np.array([100, 200, 300, 400]), axis=0)#在第1行插入一行数据
np.insert(ndarray7, 2, np.array([100, 200, 300]), axis=1)#在第2列插入一列数据

唯一化和集合函数

Python数据挖掘基础----numpy基本用法_第5张图片
使用方法:

import numpy as np

names = np.array(['aaa', 'bbb', 'ccc', 'aaa', 'ddd', 'eee', 'ccc'])
ndarray1 = np.random.randint(1, 5, 10)
ndarray2 = np.random.randint(1, 5, (3, 4))
np.unique(names)#去重,并返回有序集
np.intersect1d(ndarray3, ndarray4)#返回两个集合的交集
np.union1d(ndarray5, ndarray6)#返回两个集合的并集
np.in1d(ndarray7, ndarray8)#集合中的元素是否出现在另一个集合当中
np.setdiff1d(ndarray9, ndarray10)#ndarray9-ndarray10中出现的重复元素(差集)

数组排序

常用方法:sort

import numpy as np

ndarray1 = np.random.randint(1, 10, (1, 5))
ndarray1.sort()
ndarray2 = np.random.randint(1, 10, (5, 5))
ndarray2.sort()#默认按照每行来排序
ndarray2.sort(axis=0) #按照列来进行排序
排序:返回排序副本,源数据不变,即对原数组进行拷贝

数组和文件的读写

np.save和np.load是读写磁盘数组数据的主要函数,默认情况下数组是以原始二进制保存在.npy文件中,如果在保存文件时没有指明扩展名,会自动加上

import numpy as np

ndarray1 = np.random.randint(1, 50, (5, 6))
np.save('ndarray1', ndarray1)

ndarray2 = np.load('ndarray1.npy')#读取文件
print(ndarray2)

ndarray3 = np.random.randint(1, 50, (8, 8))
np.savez('ndarray2Andndarray3', n2=ndarray2, n3=ndarray3)#一次性将多个数组写入到文件当中

ndarray4=np.load('ndarray2Andndarray3.npz')#savz会自动给文件加上扩展名npz
print(ndarray4['n2'])
print(ndarray4)#这样只会输出一个object而不会输出值

你可能感兴趣的:(数据挖掘)