接着进行上篇开始讲,上篇主要介绍了numpy的一些基本数据操作,接下来我们进行的是numpy的矩阵合并和分割,索引等一些高级的东西。
import numpy as np
a = np.arange(3,15)
print(a)
print(a[3])#索引
b = np.arange(3,15).reshape(3,4)
print(b)
print(b[2])
print(b[1][1])
print(b[1,1])
print(b[1,:])
print(b[:,1])
print(b[1,1:3])
for row in b:
print(row)
for col in b.T:
print(col)
print(b.flatten())
for item in b.flat:
print(item)
按照前面所讲的,我们先创建一个有序的矩阵,要想知道某个位置上的具体数据,就索引出来,print(a[3])直接在屏幕上打印出来这个矩阵中第四个元素是多少。接着顺序创建一个(3,4)的矩阵,这样b[2]索引到的就是矩阵第三行的所有值,为什么是第三行?因为程序员们没有第一百朵玫瑰,哈哈。如果索引这个矩阵中的摸个位置上的具体值,就要将行和列都输上,b[1][1]是代表第二行第二列的那个数值,b[1][1]和b[1,1]是一样的效果。b[1,:]和b[1]在本例中是一样的,而b[:,1]是索引的第二列的数据,b[1,1:3]索引的是第一行第一列的和第一行第二列的数据。用for循环遍历b就是上面的方面,要想遍历b的转置就用接下来的方法。b.flatten()是将本矩阵写成一个列表的形式,若将矩阵中的数值写成一列,就需要for循环写成for item in b.flat这种循环了。
import numpy as np
a = np.array([1,1,1])
b = np.array([2,2,2])
c = np.vstack((a,b))#上下合并
d = np.hstack((a,b))#左右合并
print(a.shape,b.shape)
print(c.shape)
print(d)
print(d.shape)
print(a[np.newaxis,:])
print(a[:,np.newaxis])
A = a[:,np.newaxis]
B = b[:,np.newaxis]
e = np.vstack((A,B))
f = np.hstack((A,B))
print(e)
print(f)
C = np.concatenate((A,B,B,A),axis=1)
print(C)
现在我们来分析这段函数,首先定义两个(1,3)的矩阵,进行上下合并即变成(2,3),使用的是np.vstack(a,b)函数,a为第一行在上边。而np.hstack()是左右合并函数。a[:,np.newaxis]是改变矩阵的方向,将行矩阵变成列矩阵,同样的方法将b矩阵也变成列矩阵,这样,使用np.vstack()函数合并的话就变成6行一列,而上下合并,就变成了(3,2)矩阵。最后介绍一下合并函数np.concatenate(),可以实现若干个函数同时合并,要选择行合并和列合并只需要改变axis的值就可以了。下面贴出来输出的结果:
(3,) (3,)
(2, 3)
[1 1 1 2 2 2]
(6,)
[[1 1 1]]
[[1]
[1]
[1]]
[[1]
[1]
[1]
[2]
[2]
[2]]
[[1 2]
[1 2]
[1 2]]
[[1 2 2 1]
[1 2 2 1]
[1 2 2 1]]
import numpy as np
a = np.arange(12).reshape((3,4))
print(a)
print(np.split(a,2,axis=1))#1代表列<1>
print(np.split(a,3,axis=0))#<2>
print(np.array_split(a,3,axis=1))#<3>
print(np.vsplit(a,3))#<4>
print(np.hsplit(a,2))#<5>
下面我们来具体分析这五个函数,顾名思义,np.split函数肯定是用来分割矩阵的,那么,函数里面的参数设计可以具体去调节如何分割。首先,分割成几块就填数字几,axis取值决定行分割还是列分割,取0是行分割,取1是列分割,还有一点值得注意,这种直接分割是不能分割成不整除份的。也就是说,三行的矩阵你不能这样分成两份,可以分成3份。如果想进行不平均的分配,可以是用<3>中的np.array_split()函数,它的分割方法是尽量让第一份分割多占一些比重以便让后续平均。<4><5>是行分割和列分割的函数式,直接使用而不用对axis进行赋值。好了,分割跟合并是一样的,那么我们贴出来结果:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2, 3],
[ 6, 7],
[10, 11]])]
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2],
[ 6],
[10]]), array([[ 3],
[ 7],
[11]])]
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2, 3],
[ 6, 7],
[10, 11]])]
In [ ]:
import numpy as np
a = np.arange(4)
b = a
c = b
print(a)
b[0] = 1
print(a)
d = a.copy()
print(d)
c[3] = 0
print(d)
print(a)
很好理解,就不多做解释,直接将运行结果显示出来:
[0 1 2 3]
[1 1 2 3]
[1 1 2 3]
[1 1 2 3]
[1 1 2 0]
import numpy as np
import pandas as pd
s = pd.Series([1,3,4,np.nan,44,1])
print(s)
dates = pd.date_range('20171009',periods=6)
print(dates)
df = pd.DataFrame(np.random.rand(6,4),index = dates,columns=['a','b','c','d'])
print(df)
df1 = pd.DataFrame(np.arange(12).reshape(3,4))
print(df1)
pd.Series是字典的样式输出,即你赋予的值会在右边以列的形式打印出来,在左边会自动的生成编号。对于日期的表示可通过调节后面periods的值进行打印自己想要的日期序列,不过这步经常使用,只是展示一下如何用,包含着这种功能。DataFrame是一个表格型的数据结构,它包含一组有序的列,每列中是可以赋予不同的值得,这些值可以是整型,字符串甚至是布尔类型。它有行索引和列索引,比较全面,所以可以看做是Series组成的大字典。比如我们可以创建一组不定行不定列的标签,那么index就是从0开始的进行标定。则输出的结果如图所示:
0 1.0
1 3.0
2 4.0
3 NaN
4 44.0
5 1.0
dtype: float64
DatetimeIndex(['2017-10-09', '2017-10-10', '2017-10-11', '2017-10-12',
'2017-10-13', '2017-10-14'],
dtype='datetime64[ns]', freq='D')
a b c d
2017-10-09 0.827857 0.151108 0.265419 0.792049
2017-10-10 0.280616 0.719324 0.556846 0.194033
2017-10-11 0.538966 0.044244 0.572865 0.081814
2017-10-12 0.560581 0.893978 0.861914 0.077088
2017-10-13 0.850714 0.729712 0.003048 0.308228
2017-10-14 0.051035 0.708464 0.715050 0.705602
0 1 2 3
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
再来看np.DataFrame()函数的另外一些用法,你可以给定一些数据包括索引之类的,如下所示:
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)
print(df2.dtypes)
print(df2.index)
print(df2.columns)
print(df2.values)
print(df2.describe())
print(df2.T)
print(df2.sort_index(axis=1,ascending=False))
print(df2.sort_values(by='B'))
就像df2的赋值一样,首先,我们可以查看它的各个数据的类型,输出也是以字典的形式。还可以查看index以及其类型,还可以查看横向的index以及其类型。除此之外,还可以查询df2内部的数据值,若想知道数据的总结,也是可以通过pd.describe实现的,翻转数据和前面Numpy中翻转矩阵是一样的,只不过一般不轻易去翻转,因为正如图中的翻转显示出来的效果就不那么直观和尽如人意了。如果想对index进行排序比如横向逆序排序或者是其他单单对数值进行输出,也是可以用这些方法去进行的。pandas是一个很好的模块,来源于numpy却在某些方面是高于Numpy的。下面我们将输出结果奉上:
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
A float64
B datetime64[ns]
C float32
D int32
E category
F object
dtype: object
Int64Index([0, 1, 2, 3], dtype='int64')
Index(['A', 'B', 'C', 'D', 'E', 'F'], dtype='object')
[[1.0 Timestamp('2013-01-02 00:00:00') 1.0 3 'test' 'foo']
[1.0 Timestamp('2013-01-02 00:00:00') 1.0 3 'train' 'foo']
[1.0 Timestamp('2013-01-02 00:00:00') 1.0 3 'test' 'foo']
[1.0 Timestamp('2013-01-02 00:00:00') 1.0 3 'train' 'foo']]
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
0 1 2 \
A 1 1 1
B 2013-01-02 00:00:00 2013-01-02 00:00:00 2013-01-02 00:00:00
C 1 1 1
D 3 3 3
E test train test
F foo foo foo
3
A 1
B 2013-01-02 00:00:00
C 1
D 3
E train
F foo
F E D C B A
0 foo test 3 1.0 2013-01-02 1.0
1 foo train 3 1.0 2013-01-02 1.0
2 foo test 3 1.0 2013-01-02 1.0
3 foo train 3 1.0 2013-01-02 1.0
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