在numpy中使用+号是不能进行拼接的。
其次拼接分为竖直拼接和水平拼接。
实例:
import numpy as np
# 创建一个二维数组attr1
attr1 = np.array([[1,2,3],[4,5,6]])
# 创建一个二维数组attr2
attr2 = np.array([[7,8,9],[10,11,12]])
# 竖直拼接,参数为元组
print('***竖直拼接***')
attr3 = np.vstack((attr1,attr2))
print(attr3)
# 水平拼接
print('***水平拼接***')
attr4 = np.hstack((attr1,attr2))
print(attr4)
输出:
***竖直拼接***
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]
***水平拼接***
[[ 1 2 3 7 8 9]
[ 4 5 6 10 11 12]]
行列的交换
在处理数据的时候,有可能会把行和列交换的情况。
实例:
attr5 = np.array([[1,2,3],[4,5,6],[7,8,9],[11,22,33]])
# 行交换,交换第4行和第2行
print('***行交换***')
attr5[[1,3],:] = attr5[[3,1],:]
print(attr5)
attr6 = np.array([[1,2,3],[4,5,6],[7,8,9],[11,22,33]])
# 列交换,交换第2列和第4列
print('***列交换***')
attr6[:,[1,3]] = attr6[:,[3,1]]
print(attr6)
输出:
***行交换***
[[ 1 2 3]
[11 22 33]
[ 7 8 9]
[ 4 5 6]]
***列交换***
[[ 2 1 3]
[ 5 4 6]
[ 8 7 9]
[22 11 33]]
其他创建数组的方式和计算
实例:
# 全为0的5行6列的数组
zeros_data = np.zeros((5,6)).astype(int)
# 全为1的5行6列的数组
ones_data = np.ones((5,6)).astype(int)
# 创建一个5行5列的,对角线为1的数组
a = np.eye(5)
# 生成首位是0,末位是10,含5个数的等差数列
a = np.linspace(0,10,5)
# 首位是10的0次方,末位是10的2次方,含10个数的等比数列。
a = np.logspace(0,2,10)
# 获取数组的最大值和最小值
attr = np.array([[1,2,3],[4,5,6],[7,8,9],[11,22,33]])
# 获取最大值
print(np.max(attr))
# 获取最小值
print(np.min(attr))
# 获取最大值和最小值的位置
attr = np.array([[1,2,3],[4,5,6],[7,8,9],[11,22,33]])
# 查找每一行中最大的数字的位置
b = np.argmax(attr,axis=0)
# 查找每一行中最小的数字的位置
c = np.argmin(attr,axis = 0)
# 查找每一列中最大的数字的位置
b1 = np.argmax(attr,axis=1)
# 查找每一列中最小的数字的位置
c1 = np.argmin(attr,axis=1)
# 平均值
d = np.mean(attr,axis=0)
还有很多,求和sum,取中值median(加轴就取轴的,不加取全部),方差var(),标准差std(),极差ptp(),中值median等等。
还有:
numpy随机数
# 创建一个整数10~30的3行4列
t1 = np.random.randint(10,30,(3,4))
# 随机种子
# 让我们随机的值下次再运行还是这些值
# 1只是一个种子。可以写其他值
np.random.seed(1)
t2 = np.random.randint(0,30,(3,4))
# 同时还可以生成服从正态分布或者均匀分布的随机数
# rand,randn,uniform,normal也都可以自己去了解下。
numpy中的copy
a = b这样赋值是相互影响的。
a = b.copy(),a和b不相互影响。
这里和基础里的深浅拷贝是一个道理。
numpy中的nan和inf
1)
nan:在之前0/0会显示nan,其实nan表示不是一个数字
inf:inf表示正无穷,-inf表示负无穷,当数据不对的时候(比如1/0)就会出现这个值
2)
两个nan是不相等的
np.nan == np.nan # 会返回False
3)
# 计算数组中nan的个数
# 假如a中有nan值,我们可以找出这个值的个数
# count_nonzero统计非0数值的个数,参数可以指定值
np.count_nonzero(a!=a)
或者
np.count_nonzero(np.isnan(a))
4)
nan和其他任意值计算都是nan
5)
当我们计算的时候需要把nan替换成0或者均值,或者中值。
6)实例替换nan值
# 生成一个数组
t = np.arange(12).reshape((3,4)).astype('float')
# 将第3行的第2列和后面的替换成nan
t[2,1:] = np.nan
# 循环行
for i in range(t.shape[0]):
# 获取当前行
temp_col = t[i,:]
# 计算nan的数量
num_nan = np.count_nonzero(np.isnan(t))
# 不等于0表示存在nan值
if num_nan != 0:
temp_col[np.isnan(temp_col)] = 0
print(t)
pandas基础
numpy只能处理数值类型,而pandas是再numpy的基础上还能够处理字符串等其他类型。
1.1、安装模块:pip install pandas
实例:
# 导入模块
import pandas as pd
# 创建一个一维数组
attr = pd.Series([1,2,3,4,5,6,7,8,9])
print(attr)‘
会输出:
0 1
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
dtype: int64
# 第一列表示索引,第二列才是我们的数据,同时还输出了dtype,不同的电脑可能是int32。
我们可以指定索引:
attr1 = pd.Series([1,2,3,4,5,6,7,8,9],index = range(10,19))
print(attr1)
会输出:
10 1
11 2
12 3
13 4
14 5
15 6
16 7
17 8
18 9
dtype: int64
# 此时,索引就是我们设定的值。值得注意的是我们的索引长度需要和我们数据的长度相同。
# 创建的另一种方式
# 定义一个字典
data_dict = {'name':'张三','age':20,'sex':'男'}
attr3 = pd.Series(data_dict)
会输出:
name 张三
age 20
sex 男
dtype: object
取值直接:
attr3['name'],也可以attr3[0]
获取:取前2个
attr3[:2]
获取不连续的
attr3[[0,2]]
查找值同样可以
print(attr[attr>1])
print(attr[attr<5])
print(attr[attr==3])
查看索引:
attr.index
是可以迭代的。需要循环查看。
查看某些索引:
attr.index[:1]
查看值
attr.values。
切片,遍历都是由可以的。
很多功能和numpy中大部分都相同。这里就不在一一阐述。
pandas读取外部数据
数据准备:
创建一个csv文件,写上:
姓名,年龄,性别,身高
张三,18,男,165
李四,19,男,145
王五,20,女,178
赵六,21,女,170
python贼6,88,不知,188
实例:
# 导入模块
import pandas as pd
# 读取csv文件
read_data = pd.read_csv('demo2.csv')
print(read_data)
姓名 年龄 性别 身高
0 张三 18 男 165
1 李四 19 男 145
2 王五 20 女 178
3 赵六 21 女 170
4 python贼6 88 不知 188
# 这个文件需要放在当前文件夹下,不能含有路径。
# 如果报错:'utf-8' codec can't decode byte 0xd0 in position 0: invalid con
# 找到csv文件–>右键–>打开方式–>记事本
# 打开记事本之后,选择头部菜单的“文件–>另存为”,可以看到文件的默认编码格式为ANSI,修改为utf-8即可。
当然,pandas不仅仅可以读取csv文件,也可以读取txt文件。
还有:read_excel(),read_json(),read_html(),read_sql(),等等。
这里就不一一介绍,需要的时候百度一下,都是一样的。
下一篇文章会说读取mongodb数据库。