资讯专栏INFORMATION COLUMN

python综合学习四之Numpy和Pandas(下)

yeyan1996 / 1632人阅读

摘要:一基础运算二通过上一节的学习,我们可以了解到一部分矩阵中元素的计算和查找操作。相应的,在矩阵的个元素中,最小值即,对应索引,最大值为,对应索引为。确认是否与相同。要使用,首先需要了解他主要两个数据结构和。

这一节继续学习Numpy和Pandas。
一、numpy基础运算二

通过上一节的学习,我们可以了解到一部分矩阵中元素的计算和查找操作。然而在日常使用中,对应元素的索引也是非常重要的。依然,让我们先从一个脚本开始 :

# -*- coding:utf-8 -*-

"""
@author: Corwien
@file: np_yunsuan.py
@time: 18/8/26 23:37
"""

import numpy as np
A = np.arange(2, 14).reshape(3, 4)
# array([[ 2, 3, 4, 5]
#        [ 6, 7, 8, 9]
#        [10,11,12,13]])
         
print(np.argmin(A))    # 0
print(np.argmax(A))    # 11
常用方法

其中的 argmin()argmax() 两个函数分别对应着求矩阵中最小元素和最大元素的索引。相应的,在矩阵的12个元素中,最小值即2,对应索引0,最大值为13,对应索引为11。

如果需要计算统计中的均值,可以利用下面的方式,将整个矩阵的均值求出来:

print(np.mean(A))        # 7.5
print(np.average(A))     # 7.5

仿照着前一节中dot() 的使用法则,mean()函数还有另外一种写法:

print(A.mean())          # 7.5

同样的,我们可以写出求解中位数的函数:

print(A.median())       # 7.5

另外,和matlab中的cumsum()累加函数类似,Numpy中也具有cumsum()函数,其用法如下:

print(np.cumsum(A)) 

# [2 5 9 14 20 27 35 44 54 65 77 90]

在cumsum()函数中:生成的每一项矩阵元素均是从原矩阵首项累加到对应项的元素之和。比如元素9,在cumsum()生成的矩阵中序号为3,即原矩阵中2,3,4三个元素的和。

下面我们介绍一下nonzero()函数:

print(np.nonzero(A))    

# (array([0,0,0,0,1,1,1,1,2,2,2,2]),array([0,1,2,3,0,1,2,3,0,1,2,3]))

这个函数将所有非零元素的行与列坐标分割开,重构成两个分别关于行和列的矩阵。

索引 一维索引

在元素列表或者数组中,我们可以用如同a[2]一样的表示方法,同样的,在Numpy中也有相对应的表示方法:

# -*- coding:utf-8 -*-

"""
@author: Corwien
@file: np_index.py
@time: 18/8/28 00:49
"""

import numpy as np
A = np.arange(3, 11)

print(A)    # [3 4 5 6 7 8 9 10]
print(A[3]) # 6

让我们将矩阵转换为二维的,此时进行同样的操作:

A = np.arange(3, 11).reshape(2, 4)

"""
[[ 3  4  5  6]
 [ 7  8  9 10]]
"""

print(A[1]) # [ 7  8  9 10]

实际上这时的A[1]对应的就是矩阵A中第二行(从0开始算第一行)的所有元素。

二维索引

如果你想要表示具体的单个元素,可以仿照上述的例子:

print(A[1][1])      # 8

此时对应的元素即A[1][1],在A中即横纵坐标都为1,第二行第二列的元素,即8(因为计数从0开始)。同样的还有其他的表示方法:

print(A[1, 1])      # 8

在Python的 list 中,我们可以利用:对一定范围内的元素进行切片操作,在Numpy中我们依然可以给出相应的方法:

print(A[1, 1:3])    # [8 9]

这一表示形式即针对第二行中第2到第4列元素进行切片输出(不包含第4列)。

此时我们适当的利用for函数进行打印:

for row in A:
    print(row)
    
"""    
[ 3,  4,  5, 6]
[ 7,  8,  9, 10]
"""

此时它会逐行进行打印操作。如果想进行逐列打印,就需要稍稍变化一下:

for column in A.T:
    print(column)
"""  
[3 7]
[4 8]
[5 9]
[ 6 10]
"""

上述表示方法即对A进行转置,再将得到的矩阵逐行输出即可得到原矩阵的逐列输出。

最后依然说一些关于迭代输出的问题:

import numpy as np
A = np.arange(3,15).reshape((3,4))
         
print(A.flatten())   
# array([3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])

for item in A.flat:
    print(item)
    
# 3
# 4
……
# 14

这一脚本中的flatten是一个展开性质的函数,将多维的矩阵进行展开成1行的数列。而flat是一个迭代器,本身是一个object属性。

合并

np.vstack() # vertical stack 上下合并

np.hstack() # horizontal stack 左右合并

np.newaxis() # 中转置操作

np.concatenate() # 多个合并

分割 创建数据
# -*- coding:utf-8 -*-

"""
@author: Corwien
@file: np_split.py
@time: 18/8/28 01:21
"""

import numpy as np

A = np.arange(12).reshape((3, 4))
print(A)
"""
array([[ 0,  1,  2,  3],
    [ 4,  5,  6,  7],
    [ 8,  9, 10, 11]])
"""
   
纵向分割
print(np.split(A, 2, axis=1))
"""
[array([[0, 1],
        [4, 5],
        [8, 9]]), array([[ 2,  3],
        [ 6,  7],
        [10, 11]])]
"""
横向分割
print(np.split(A, 3, axis=0))

# [array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]
错误的分割

范例的Array只有4列,只能等量对分,因此输入以上程序代码后Python就会报错。

print(np.split(A, 3, axis=1))

# ValueError: array split does not result in an equal division

为了解决这种情况, 我们会有下面这种方式.

不等量的分割

在机器学习时经常会需要将数据做不等量的分割,因此解决办法为np.array_split()

print(np.array_split(A, 3, axis=1))
"""
[array([[0, 1],
        [4, 5],
        [8, 9]]), array([[ 2],
        [ 6],
        [10]]), array([[ 3],
        [ 7],
        [11]])]
"""

成功将Array不等量分割!

其他的分割方式

在numpy里还有np.vsplit()与横np.hsplit()方式可用。

print(np.vsplit(A, 3)) #等于 print(np.split(A, 3, axis=0))

# [array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]


print(np.hsplit(A, 2)) #等于 print(np.split(A, 2, axis=1))
"""
[array([[0, 1],
       [4, 5],
       [8, 9]]), array([[ 2,  3],
        [ 6,  7],
        [10, 11]])]
"""
copy & deep copy = 的赋值方式会带有关联性
import numpy as np

a = np.arange(4)
# array([0, 1, 2, 3])

b = a
c = a
d = b

改变a的第一个值,bcd的第一个值也会同时改变。

a[0] = 11
print(a)
# array([11,  1,  2,  3])

确认b、c、d是否与a相同。

b is a  # True
c is a  # True
d is a  # True

同样更改d的值,abc也会改变。

d[1:3] = [22, 33]   # array([11, 22, 33,  3])
print(a)            # array([11, 22, 33,  3])
print(b)            # array([11, 22, 33,  3])
print(c)            # array([11, 22, 33,  3])
copy() 的赋值方式没有关联性

deep copy 为深赋值,重新建了一个地址

b = a.copy()    # deep copy
print(b)        # array([11, 22, 33,  3])
a[3] = 44
print(a)        # array([11, 22, 33, 44])
print(b)        # array([11, 22, 33,  3])

此时ab已经没有关联。

二、pandas基础 1、Numpy和Pandas有什么不同

如果用 python 的列表和字典来作比较, 那么可以说 Numpy 是列表形式的,没有数值标签,而 Pandas 就是字典形式。Pandas是基于Numpy构建的,让Numpy为中心的应用变得更加简单。

要使用pandas,首先需要了解他主要两个数据结构:SeriesDataFrame

Series
# -*- coding:utf-8 -*-

"""
@author: Corwien
@file: pd_new.py
@time: 18/8/30 00:22
"""

import pandas as pd
import numpy as np

s = pd.Series([1, 3, 6, np.nan, 44, 1])

print s

结果打印:

/Users/corwien/anaconda2/bin/python /Users/corwien/Code/python/baseLearn/pandas/pd_new.py

0     1.0
1     3.0
2     6.0
3     NaN
4    44.0
5     1.0
dtype: float64

Series的字符串表现形式为:索引在左边,值在右边。由于我们没有为数据指定索引。于是会自动创建一个0到N-1(N为长度)的整数型索引。

DataFrame
dates = pd.date_range("20180830", periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=["A", "B", "C", "D"])

print(df)
"""
                   A         B         C         D
2018-08-30 -0.838769 -0.366117 -0.501002 -0.418720
2018-08-31  0.062155  1.467156  1.995968 -0.460316
2018-09-01  0.553028  0.144778  1.944617  1.709808
2018-09-02 -0.116423 -1.134185  1.231541  0.862480
2018-09-03 -0.823016  0.491625 -1.448212 -0.921488
2018-09-04 -0.226200  0.353459  0.219459  0.635181
"""

DataFrame是一个表格型的数据结构,它包含有一组有序的列,每列可以是不同的值类型(数值,字符串,布尔值等)。DataFrame既有行索引也有列索引, 它可以被看做由Series组成的大字典。

我们可以根据每一个不同的索引来挑选数据, 比如挑选 B 的元素:

DataFrame 的一些简单运用
print(df["b"])

"""
2018-08-30    0.391123
2018-08-31   -0.508613
2018-09-01    1.618023
2018-09-02   -1.168342
2018-09-03   -0.915434
2018-09-04    0.595129
Freq: D, Name: B, dtype: float64
"""

我们在创建一组没有给定行标签和列标签的数据 df1:

df1 = pd.DataFrame(np.arange(12).reshape((3,4)))
print(df1)

"""
   0  1   2   3
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11
"""

这样,他就会采取默认的从0开始 index. 还有一种生成 df 的方法, 如下 df2:

df2 = pd.DataFrame({"A" : 1.,
                    "B" : pd.Timestamp("20130102"),
                    "C" : pd.Series(1,index=list(range(4)),dtype="float32"),
                    "D" : np.array([3] * 4,dtype="int32"),
                    "E" : pd.Categorical(["test","train","test","train"]),
                    "F" : "foo"})
                    
print(df2)

"""
     A          B    C  D      E    F
0  1.0 2013-01-02  1.0  3   test  foo
1  1.0 2013-01-02  1.0  3  train  foo
2  1.0 2013-01-02  1.0  3   test  foo
3  1.0 2013-01-02  1.0  3  train  foo
"""

这种方法能对每一列的数据进行特殊对待. 如果想要查看数据中的类型, 我们可以用 dtype 这个属性:

print(df2.dtypes)

"""
df2.dtypes
A           float64
B    datetime64[ns]
C           float32
D             int32
E          category
F            object
dtype: object
"""

同样, 每种数据的名称也能看到:

print(df2.columns)
# Index(["A", "B", "C", "D", "E", "F"], dtype="object")

想知道数据的总结, 可以用 describe():

df2.describe()

"""
         A    C    D
count  4.0  4.0  4.0
mean   1.0  1.0  3.0
std    0.0  0.0  0.0
min    1.0  1.0  3.0
25%    1.0  1.0  3.0
50%    1.0  1.0  3.0
75%    1.0  1.0  3.0
max    1.0  1.0  3.0
"""

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42304.html

相关文章

  • python综合学习三之NumpyPandas

    摘要:本章学习两个科学运算当中最为重要的两个模块,一个是一个是。这种工具可用来存储和处理大型矩阵,比自身的嵌套列表结构要高效的多该结构也可以用来表示矩阵。专为进行严格的数字处理而产生。可以通过函数对相应值进行打印检验。 本章学习两个科学运算当中最为重要的两个模块,一个是 numpy,一个是 pandas。任何关于数据分析的模块都少不了它们两个。 一、numpy & pandas特点 NumP...

    tinylcy 评论0 收藏0
  • Python机器学习入门资料整理

    摘要:在基本语法入门之后,就要准备选一个研究方向了。是自己比较感兴趣的方向,可是,导师这边的数据处理肯定不能由我做主了。真的挺愁人的还有几个月就要进行春季实习招聘了,加油总结一下机器学习方面的资料吧。 在python基本语法入门之后,就要准备选一个研究方向了。Web是自己比较感兴趣的方向,可是,导师这边的数据处理肯定不能由我做主了。paper、peper、paper……真的挺愁人的 还有几个...

    Rango 评论0 收藏0
  • 【数据科学系统学习Python # 数据分析基本操作[二] pandas

    摘要:中面向行和面向列的操作基本是平衡的。用层次化索引,将其表示为更高维度的数据。使用浮点值表示浮点和非浮点数组中的缺失数据。索引的的格式化输出形式选取数据子集在内层中进行选取层次化索引在数据重塑和基于分组的操作中很重要。 我们在上一篇介绍了 NumPy,本篇介绍 pandas。 pandas入门 Pandas 是基于Numpy构建的,让以NumPy为中心的应用变的更加简单。 pandas...

    jayzou 评论0 收藏0
  • python数学建模是加深NumpyPandas学习

      小编写这篇文章的主要目的,主要是来给大家去做一个介绍的,介绍的内容主要还是涉及到python的一些相关事情,比如我们可以利用python去进行搭建数字建模的相关平台。其中,主要的内容有加深Numpy和Pandas的相关学习,具体内容,下面给大家详细解答下。  Numpy学习  #Numpy的基本使用   '''   Numpy提供了两种基本的对象:ndarray存储单一...

    89542767 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<