时隔六年,Wes McKInney终于推出第二版了。对于使用Python3.6以及pandas 0.23.4的我来说,这是一个天大的好消息。因为终于不用忍受,使用第一版时总遇到语法不一致。话不多说,我先大致介绍一下,第二版的新内容。
第二版中的主要更新包括:
本书第二章介绍Python语言基础、Ipython及Jupyter notebook,第三章介绍了内建数据结构、函数以及文件。由于笔者有一定的Python编程经验,这里我就直接跳过第二章和第三章直接进入后面章节的想学习。如有读者还不了解Python编程语言的请先学习廖雪峰Python教程。
第二、三章中我认为值得注意的知识点:
strings=['foo','card','bar','aaaa','abab']
strings.sort(key=lambda x:len(set(list(x))))
print(strings)
运行结果:
['aaaa', 'foo', 'abab', 'bar', 'card']
2. itertools 模块
例如:
groupby可以根据任意的序列和一个函数,通过函数的返回值对序列中的连续的元素进行分组。
import itertools
first_leetter=lambda x:x[0]
names=['Alan','Adam','Wes','Will','Albert','Steven']
for letter,names in itertools.groupby(names,first_leetter):
print(letter,list(names))#names is a generator
运行结果如下:
A ['Alan', 'Adam']
W ['Wes', 'Will']
A ['Albert']
S ['Steven']
一些有用的itertools函数:
import numpy as np
#生成随机数据
data=np.random.randn(2,3)
print(data)
运行结果:
[[-1.38868928 0.60036765 0.54270476]
[-0.3853248 -0.75124344 0.00777614]]
#数学操作
print(data*10)
print(data+data)
运行结果:
[[-13.88689281 6.00367651 5.42704757]
[ -3.853248 -7.51243443 0.07776136]]
[[-2.77737856 1.2007353 1.08540951]
[-0.7706496 -1.50248689 0.01555227]]
在第一个数学操作中,所有的元素都同时乘以了10。在第二个数学操作中,数组中的对应元素进行了相加。
注:ndarray是一个通用的多维同类数据容器,即:它包含的每一个元素均为相同类型。
每一个数组都有一个shape属性,用来表征数组每一维度的数量:
print(data.shape)
运行结果:
(2, 3)
每一个数组都有一个dtype属性,用来描述数组的数据类型:
print(data.dtype)
运行结果:
float64
例1:
data1=[6,7.5,8,0,1]
arr1=np.array(data1)
print(arr1)
例2:
data2=[[1,2,3,4],[5,6,7,8]]
arr2=np.array(data2)
print(arr2)
运行结果:
[[1 2 3 4]
[5 6 7 8]]
arr2的维数
print(arr2.ndim)
运行结果:
2
参考文献:
numpy官网
np.array会自动推断生成数组的数据类型,并存储在一个特殊元数据dtype中。例如:
print(arr1.dtype)
运行结果:
float64
print(arr2.dtype)
运行结果:
int32
给定长度及形状后,zeros可以一次性创造全0数组,ones可以一次性创造全1数组:
print(np.zeros(10))
运行结果:
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
print(np.zeros((3,6)))
运行结果:
[[0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0.]]
empty可以创建一个没有初始化数值的数组:
print(np.empty((2,3,2)))
运行结果:
[[[1.28760970e-311 1.28760970e-311]
[1.28760972e-311 1.28760969e-311]
[1.28760972e-311 1.28760972e-311]]
[[1.28760972e-311 1.28760969e-311]
[1.28760969e-311 0.00000000e+000]
[1.28760969e-311 1.28760969e-311]]]
注:使用np.empty来生成全0数组,并不安全,有些时候它会返回为初始化的垃圾数值。上面运行结果也证实了这一观点。
arange是Python内建函数range的数组版:
print(np.arange(15))
运行结果:
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]
数组生成函数:
函数名 | 描述 |
---|---|
array | 将输入数据(可以是列表、元组、数组以及其他序列)转换为ndarray,如不显式指明数据类型,将自动推断;默认复制所有的输入数据 |
asarray | 将输入数据转化为ndarray,但如果输入已经是ndarray则不再复制 |
arange | Python内建函数arange的数组版,返回一个数组 |
ones | 根据给定形状和数据类型生成全1数组 |
ones_like | 根据所给的数组生成一个形状一样的全1数组 |
zeros | 根据给定形状和数据类型生成全0数组 |
zeros_like | 根据所给的1数组生成一个形状一样的全0数组 |
empty | 根据给定的形状生成一个没有初始化熟知的空数组 |
empty_like | 根据所给数组生成一个形状一样但没有初始化数值的空数组 |
full | 根据给定形状和数据类型生成指定数值的数组 |
full_like | 根据所给的数组生成一个形状一样单内容是指定数值的数组 |
eye,identity | 生成一个N×N特征矩阵(对角线位置都是1,去位置是0) |
例如:
print(np.identity(5))
运行结果:
[[1. 0. 0. 0. 0.]
[0. 1. 0. 0. 0.]
[0. 0. 1. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]]
print(np.eye(5))
运行结果:
[[1. 0. 0. 0. 0.]
[0. 1. 0. 0. 0.]
[0. 0. 1. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]]