3.2 创建与加载数组

3.2.1 创建数组

下面逐一介绍创建数组的不同方式。

指定元素

# array
x = array([1, 2, 3])

# array with data type
x = array([1, 2, 3], dtype=float64)

# matrix
y = array([[1, 2, 3], [4, 5, 6]])

# multiplication table
def mul_table(n):
    return array([[(i+1) * (j+1) for i in xrange(n)] for j in xrange(n)])

使用NumPy的内置函数

# 100 zeros
x = zeros(100)

# 10 * 10 zeros
x = zeros((10, 10))

# ones is similar to zeros

# identity, eye, diag
x = identity(5)
x = eye(5, k=1)

# spaced numbers
x = arange(1, 10, 2)
# array([1, 3, 5, 7, 9])

x = linspace(1, 10, 5)
# array([1. , 3.25, 5.5 , 7.75, 10. ])

使用随机值

# 均匀分布(uniformly sampled numbers bttween 0 and 1)
rand(2, 5)

# 正态分布(normal distribution)
randn(2, 5)

# or randint(random integers), exponential

# shuffle/permutation
arr = arange(10)
shuffle(arr)
# array([6, 4, 3, 5, 9, 2, 7, 1, 8, 0])

3.2.2 加载数组

在处理数据时,往往会需要从它处加载数据,而非自行创建,“它处”可以是其它Python变量的值,或其它数据文件。NumPy很擅长读取文本文件或CSV文件数据。此外,Pandas包在处理表格化数据亦很有用。表格化数据可视作数据库表的等价物,包含的数据可以是数字,也可以是如字符串之类的数据。

从Python对象

标准方法是array函数。

从缓冲区或外部文件

另一种常见的方式是从内存缓冲区或文件中加载数据。

p.fromstring('1 2 5 10', dtype=int, sep=' ')
# array([ 1,  2,  5, 10])

# or use frombuffer()
# or fromfile(), loadtxt(), genfromtxt()

保存数组到文件可使用save或savetxt。另外两个相关函数是loadz和savez。

使用Pandas

Pandas擅长处理表格化数据,除了加载外,还可以处理缺失值、数据对齐问题(时间序列)。

现在来看看如何处理真实世界中的数据集,下载http://ipython.rossant.net/cities.zip 文件,解压缩,然后:

data = pd.read_csv(filename, low_memory=False)
type(data)
# pandas.core.frame.DataFrame

DataFrame对象用于表示二维数据集,较NumPy的数组结构上更为丰富,keys方法返回各列的名字。

data.shape, data.keys()

# take a quick look a the data
data.head()
data.tail()