数据分析之numpy的使用

创建数组:

初始化数组:

print(numpy.array([1,2,3,4,5])
print(numpy.array(range(1,6)))
print(numpy.arange(0,15).reshape(3,5))
print(numpy.linspace(0,2,9))#从零到二之间取9个数
print(numpy.zeros([2,3]))#两行三列的0
print(numpy.ones([2,3]))#两行三列的1
print(numpy.ones((2,2,2)))#三维
#打印出来的列表无逗号,是numpy.ndarray类型

属性:

  • ndarray.ndim

    数组维度,在python的世界中,轴可以使用0,1,2等数字表示,轴的个数被称作秩。也就是我们常说的二维数组,三维数组

  • ndarray.shape

    数组的维度大小。指示数组的行数列数。

  • ndarray.size

    数组元素的总个数,等于shape属性中元组元素的乘积。

  • ndarray.dtype

    一个用来描述数组中元素类型的对象,可以通过创造或指定dtype使用标准Python类型。另外NumPy提供它自己的数据类型(bool,int,int8,int16,int 32,int 64, int128, uint8,uint16,uint32,uint64,uint128,float, float16,float32, float64,float128)。

    #一下都不改变原来的数组
    #指定类型
    z = np.arange(3, dtype=np.uint8)
    a=np.array([1,0,1,0],dtype=np.bool)
    print(a)
    #修改类型
    print(a.astype(np.int8))
    #astype()中可以使用python中的int,float,complex,bool其他类型不支持,比如:a.astype(int)
    #修改浮点型的小数位数
    b=np.array([1.2222,2.33333])
    print(np.round(b,2))
    
  • ndarray.itemsize

    数组中每个元素的字节大小。例如,一个元素类型为float64的数组itemsiz属性值为8(=64/8),又如,一个元素类型为complex32的数组item属性为4(=32/8).

  • ndarray.data

    包含实际数组元素的缓冲区,通常我们不需要使用这个属性,因为我们总是通过索引来使用数组中的元素。

    import numpy
    lst=[[1,3,5],[2,4,6]]
    print(type(lst))#<class 'list'>
    np_lst=numpy.array(lst,dtype=numpy.float)
    print(type(np_lst))#<class 'numpy.ndarray'>
    print(np_lst.ndim)#2
    print(np_lst.shape)#(2, 3)
    #改变shape
    print(np_lstt.reshape(3,2))#三行两列的二维数组
    np_lstt.flatten()#变为一维数组
    print(np_lst.size)#6
    print(np_lst.dtype)#float64
    print(np_lst.itemsize)#8
    print(np_lst.data)#<memory at 0x0000020F5FB0ACF0>
    

算数操作

对数组中的算术操作是元素对应(elementwise)的,例如,对两个数组进行加减乘除,其结果是对两个数组对一个位置上的数进行加减乘除,数组算术操作的结果会存放在一个新建的数组中。

算数操作,对应的是相同位置上的元素的操作,结果形成一个新的数组;当操作不同类型的数组时,最终的结果数组的类型取决于精度最宽的数组的类型。

#不同维度的数组不能计算但是符合广播原则的可以计算
list1=numpy.arange(0,15)
list2=numpy.arange(15,30)
print(list2-list1)#[15 15 15 15 15 15 15 15 15 15 15 15 15 15 15]
print(list1.dot(list2))#矩阵乘法
print(numpy.dot(list1,list2))#和上面相同

改变原数组

a=numpy.ones((2,3),dtype=int)
print(a)
a*=3#*=,+=,-=,/=
print(a)
#[[1 1 1]
# [1 1 1]]
#[[3 3 3]
# [3 3 3]]

操作数组的一元方法:

import numpy
a=numpy.arange(10).reshape(2,5)
print(a)
print(a.sum())
print(a.min())
print(a.max())
np.argmax(a,axis=0)
print(a.sum(axis=0))#每一列相加[ 5  7  9 11 13]
print(a.sum(axis=1))#每一行相加[10 35]
print(a.cumsum(axis=0))#每一行都是前面的列的和

统计运算:

索引、切片、迭代

a=numpy.arange(10).reshape(2,5)
print(a[1])
for i in a:
    print(i)
for item in a.flat:#其中flat属性是array中的每个元素的迭代器。
    print(item)

改变shape操作

a=numpy.ones((3,4))
print(a)
print(a.ravel())#一维数组
print(a.reshape(2,-1))#指定行数
print(a.T)
#resize()方法和reshape()方法的最主要区别在于,reshape()方法返回一个特定shape的数组,而resize()方法会直接更改原数组。
a.resize(4,3)
print(a)

复制和视图

  1. Python通用的地址复制:通过 b = a 复制 a 的值,b 与 a 指向同一地址,改变 b 同时也改变 a。
  2. 通过视图ndarray.view()仅复制值,当对 c 值进行改变会改变 a 的对应的值,而改变 c 的 shape 不改变 a 的 shape
  3. ndarray.copy() 进行的完整的拷贝,产生一份完全相同的独立的复制。
import numpy
a=numpy.ones((3,4))
b=a
b[2][2]=0
print(a is b)#True
print(a)
print(b)

c=a.view()
print(c is a)
a[2][2]=0
c[2][3]=0
a.resize(4,3)
print(a)
print(c)#shape不会变
d=a.copy()

条件运算

import numpy
stus_score = numpy.array([[80, 88], [82, 81], [84, 75], [86, 83], [75, 81]])
print(stus_score > 80)#条件判断,返回列表,满足条件返回True,否则False
#[[False  True][ True  True][ True False][ True  True][False  True]]
stus_score[stus_score>80]=80#将所有大于80的数字改为80
#三目运算
print(numpy.where(stus_score<80,0,90))#遇到nan会报错
#[[90 90][90 90][90  0][90 90][ 0 90]]
#clip剪裁
print(a.clip(2,4))#小于2的替换成2,大于4的替换成4,nan没有替换

NAN和INF

nan代表的是:not a number;进行数据处理时,将缺失值设为男

print(np.nan==np.nan)#False
print(np.count_nonzero(a!=a))#利用上面特性统计有多少空值

INF代表:正无穷,-INF代表:负无穷;

#将nan和inf替换成特定的数字
a=np.array([1,2,np.nan,3,5])
t=np.isnan(a)
a[t]=10
print(a)

数组的拼接:

a=np.arange(12).reshape(2,6)
b=np.arange(12,24).reshape(2,6)
print(np.append(a,b))
print(np.append(a,b,axis=1))
#或者print(np.concatenate((a,b),axis=1))
print(np.append(a,b,axis=0))
#或者print(np.concatenate((a,b)))

结果:

[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]

[[ 0 1 2 3 4 5 12 13 14 15 16 17][ 6 7 8 9 10 11 18 19 20 21 22 23]]

[[ 0 1 2 3 4 5][ 6 7 8 9 10 11][12 13 14 15 16 17][18 19 20 21 22 23]]

print(np.concatenate((a,b)))
print(np.concatenate((a,b),axis=1))
a=np.arange(12).reshape(2,6)
b=np.arange(12,24).reshape(2,6)
zero=np.zeros((2,1))
one=np.ones((2,1))

a=np.hstack((a,zero))#水平拼接,行数相等
b=np.hstack((b,one))
print(np.vstack((a,b)))#竖直拼接,列数相等

在这里插入图片描述

读取数据(csv):

a=np.loadtxt('./youtube_video_data/US_video_data_numbers.csv',delimiter=',',dtype='int')#路径,分隔符,类型
print(a)#所有的数据
print(a[2])#取第三列
print(a[2,1:])#第二行,第二列之后的所有
print(a[[0,2,2],:])#1,3,3行的所有列
print(a[1,0])#取第二列第一个数字
print(a[:,[1,2,3]])#所有行的第一,二,三列
print(a[[0,2,2],[0,1,3]])#相当于[a[0,0],a[2,1],a[2,3]]

猜你喜欢

转载自blog.csdn.net/Li_peipei/article/details/82987989
今日推荐