Python数据处理

Python数据处理-numpy和pandas库的学习

1.numpy数组

1.1numpy的ndarray:一种多维数组对象

ndarray是一个通用的同构数据多维容器,其中所有的元素必须是相同类型的,每个数组都有一个shape(一个表示各维度大小的元组)和一个dtype(一个用于说明数组数据类型的对象)

1.1.1创建ndarray

创建数组最简单的方法就是使用array函数,它接受一切序列型的对象(包括其他数组),然后产生一个新的含有传入数据的Numpy数组。

import numpy as np
data1=[6,7.5,8,0,1]
arr1=np.array(data1)
print(arr1)
print(arr1.dtype)

data2=[[1,2,3,4],[5,6,7,8]]
arr2=np.array(data2)
print(arr2)
print(arr2.ndim)
print(arr2.shape)#shape表示各维度大小的元组dtype用于说明数组数据类型的对象
print(arr2.dtype)

结果
[6.  7.5 8.  0.  1. ]
float64
[[1 2 3 4]
 [5 6 7 8]]
2
(2, 4)
int32

数组创建函数如下表:

1.1.2ndarray的数据类型

Numpy的数据类型如下表所示

可以通过ndarray的astype方法显式的转换其dtype:

data1=[6,7.5,8,0,1]
arr1=np.array(data1)
print(arr1)
print(arr1.dtype)
float_arr=arr1.astype(np.int32)
print(float_arr.dtype)
结果:
[6.  7.5 8.  0.  1. ]
float64
int32

注意:调用astype无论如何都会创建一个新的数组(原始数据的一份拷贝),即使新dtype跟老dtype相同也是如此。

1.1.3数组和标量之间的运算

数组很重要,因为它使你不用编写循环即可对数据执行批量操作,这通常就叫矢量化

arr3=np.array([[1,2,3],[4,5,6]])
print(arr3*arr3)
print(arr3+arr3)
print(1/arr3)
print(arr3 ** 0.5)
结果:
[[ 1  4  9]
 [16 25 36]]
[[ 2  4  6]
 [ 8 10 12]]
[[1.         0.5        0.33333333]
 [0.25       0.2        0.16666667]]
[[1.         1.41421356 1.73205081]
 [2.         2.23606798 2.44948974]]

不同大小的数组之间的运算叫做广播。

1.1.4基本的索引和切片
arr4=np.arange(10)
print(arr4)
print(arr4[5])
print(arr4[5:8])
arr4[5:8]=12
print(arr4)
结果:
[0 1 2 3 4 5 6 7 8 9]
5
[5 6 7]
[ 0  1  2  3  4 12 12 12  8  9]

数组切片是原始数组的视图,就是说切片的数据并不是复制过去的,在切片里面的所有操作都会使原数组产生改变。

arr_slice=arr4[5:8]
arr_slice[1]=12345
print(arr_slice)
print(arr4)
arr_slice[:]=64
print(arr4)
结果:
[   12 12345    12]
[    0     1     2     3     4    12 12345    12     8     9]
[ 0  1  2  3  4 64 64 64  8  9]

如果想要得到ndarray的一份副本而非视图,就需要显式的进行复制操作,如arr[5:8].copy()。

arr_copy=arr4[5:8].copy()
arr_copy[1]=12345
print(arr_copy)
print(arr4)
结果:
[   64 12345    64]
[ 0  1  2  3  4 64 64 64  8  9]

对于高维数组,能做的事情更多。在一个二维数组中,各索引位置上的元素不再是标量而是一维数组。

arr2d=np.array([[1,2,3],[4,5,6],[7,8,9]])
print(arr2d[2])
结果:
[7,8,9]
1.1.5多维数组切片索引
arr2d=np.array([[1,2,3],[4,5,6],[7,8,9]])
print(arr2d[2])
print(arr2d[:2,1:])
print(arr2d[:,:1])
结果:
[[2 3]
 [5 6]]
[[1]
 [4]
 [7]]
1.1.6布尔型索引
names=np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe'])
data3=nr.randn(7,4)#使用numpy.random中的randn函数生成一些正态分布的随机数据
print(names)
print(data3)
print(names=='Bob')#对names和字符串‘Bob’的比较运算会产生一个布尔型数组
print(data3[names=='Bob',2:])
mask=(names=='Bob')|(names=='Will')#python中或是|,与是&
data3[data3<0]=0
print(data3)
结果:
['Bob' 'Joe' 'Will' 'Bob' 'Will' 'Joe' 'Joe']
[[ 0.3219548  -0.59555927 -3.14633636  0.48836479]
 [-0.24490771 -0.1426474  -0.75215074  0.50737398]
 [-0.2378058  -0.18964623 -0.26918087  0.22581556]
 [ 0.10582164 -0.22181722  0.76781671 -0.2722836 ]
 [ 1.23326769  0.84703433  0.26385051  0.0564877 ]
 [ 0.0939848  -0.23754006 -2.52979677  0.18824197]
 [ 1.76011544 -2.3913036  -0.39906928 -0.02587612]]
[ True False False  True False False False]
[[-3.14633636  0.48836479]
 [ 0.76781671 -0.2722836 ]]
[[0.3219548  0.         0.         0.48836479]
 [0.         0.         0.         0.50737398]
 [0.         0.         0.         0.22581556]
 [0.10582164 0.         0.76781671 0.        ]
 [1.23326769 0.84703433 0.26385051 0.0564877 ]
 [0.0939848  0.         0.         0.18824197]
 [1.76011544 0.         0.         0.        ]]

1.1.7花式索引

花式索引是一个Numpy术语,它指的是利用整数数组进行索引。

以特定顺序选取子集,只需传入一个用于指定顺序的整数列表或ndarray即可。使用负数索引将会从末尾开始选行。

arr5=np.empty((8,4))#创建一个8*4数组
for i in range(8):
    arr5[i]=i
print(arr5)
print(arr5[[4,3,0,6]])#以特定顺序选取子集,只需传入一个用于指定顺序的整数列表或ndarray即可
print(arr5[[-3,-5,-7]])#使用负数索引将会从末尾开始选行
结果:
[[0. 0. 0. 0.]
 [1. 1. 1. 1.]
 [2. 2. 2. 2.]
 [3. 3. 3. 3.]
 [4. 4. 4. 4.]
 [5. 5. 5. 5.]
 [6. 6. 6. 6.]
 [7. 7. 7. 7.]]
[[4. 4. 4. 4.]
 [3. 3. 3. 3.]
 [0. 0. 0. 0.]
 [6. 6. 6. 6.]]
[[5. 5. 5. 5.]
 [3. 3. 3. 3.]
 [1. 1. 1. 1.]]

一次传入多个数组,返回的是一个一维数组,其中的元素对应各个索引元组。

arr6=np.arange(32).reshape((8,4))
print(arr6)
print(arr6[[1,5,7,2],[0,3,1,2]])#最终选出的元素是元素(1,0)(5,3)(7,1)(2,2)
print(arr6[np.ix_([1,5,7,2],[0,3,1,2])])#np.ix_函数可以将两个一维整数数组转换为用于选取方形区域的索引器
结果
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]
 [16 17 18 19]
 [20 21 22 23]
 [24 25 26 27]
 [28 29 30 31]]
[ 4 23 29 10]
[[ 4  7  5  6]
 [20 23 21 22]
 [28 31 29 30]
 [ 8 11  9 10]]

花式索引跟切片不一样,它总是将数据复制到新数组中。

1.1.8数组转置和轴转换
arr7=np.arange(15).reshape((3,5))
print(arr7)
print(arr7.T)#数组的转置
#结果
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]]
[[ 0  5 10]
 [ 1  6 11]
 [ 2  7 12]
 [ 3  8 13]
 [ 4  9 14]]

你可能感兴趣的:(python数据处理与分析,python,开发语言,后端,pandas,numpy)