首先声明本篇博客是本人学习CS231n的学习笔记,分享给大家当作参考。原文请看本人博文

Numpy是Python中用于科学计算的核心库。它提供了高性能的多维数组对象,以及相关工具。(其中很多函数类似于matlab中的函数,如果有matlab基础建议看[NumPy_for_Matlab_Users ](http://scipy.github.io/old-wiki/pages/NumPy_for_Matlab_Users))

数组创建

一个numpy数组是一个由不同数值组成的网格。网格中的数据都是同一种数据类型,可以通过非负整型数的元组来访问。维度的数量被称为数组的阶,数组的大小是一个由整型数构成的元组,可以描述数组不同维度上的大小。

创建数组有5个通用机制:

1.从其他 Python 结构 (例如, 列表, 元组) 的转换

2.内部 numpy 数组函数创建对象 (例如,arange, ones, zeros, 等)

3.从磁盘读取数组, 从标准或自定义格式

4.通过使用字符串或缓冲区从原始字节创建数组

5.使用特殊的 library功能 (例如, random)

其中,最常用的是前两种方法在此进行简要介绍。

(1)从列表创建数组,然后利用方括号访问其中的元素:

“`

>>> import numpy as np

>>> a = np.array([1,2,3])

>>> print(type(a))

<class 'num;>

>>> prin)

(3,)

>>> print(a[0],a[1],a[2])

1 2 3

>>> a[0] = 5

>>> print(a)

[5 2 3]

>>> b = np.array([[1,2,3],[4,5,6]])

>>> print(b)

[[1 2 3]

[4 5 6]]

>>> prin)

(2, 3)

>>> print(b[0,0],b[0,1],b[1,0])

1 2 4

“`

(2)内部 numpy 数组函数创建对象 (例如,arange, ones, zeros, 等)

“`

>>> import numpy as np

>>> a = np.zeros((2,2))

>>> print(a)

[[ 0. 0.]

[ 0. 0.]]

>>> b = np.ones((1,2))

>>> print(b)

[[ 1. 1.]]

>>> c = np.full((2,2),7)

>>> print(c)

[[7 7]

[7 7]]

>>> d = np.eye(2)

>>> print(d)

[[ 1. 0.]

[ 0. 1.]]

>>> e = np.random.random((2,2))

>>> print(e)

[[ 0.90679082 0.04361987]

[ 0.85688384 0.6434056 ]]

>>> f = np.arange(10) #值递增

>>> print(f)

[0 1 2 3 4 5 6 7 8 9]

>>> g = np.arange(2,10,dtype=np.float)

>>> print(g)

[ 2. 3. 4. 5. 6. 7. 8. 9.]

>>> h = np.arange(2,3,0.1)

>>> print(h)

[ 2. 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9]

>>> i = np.linspace(1.,4.,6) #创建具有指定数目的元素的数组, 并在指定的开始值和结束数值之间平均间隔

>>> print(i)

[ 1. 1.6 2.2 2.8 3.4 4. ]

“`

更详细的数组创建方法请看[Array creation](https://docs.scipy.org/doc/numpy/user/basics.creation.html#arrays-creation)

访问数组

Numpy提供了多种访问数组的方法。

切片:和Python列表类似,numpy数组可以使用切片语法。因为数组可以是多维的,所以你必须为每个维度指定好切片。

“`

>>> import numpy as np

# Create the following rank 2 array with shape (3, 4)

# [[ 1 2 3 4]

# [ 5 6 7 8]

# [ 9 10 11 12]]

>>> a = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])

# Use slicing to pull out the subarray consisting of the first 2 rows

# and columns 1 and 2; b is the following array of shape (2, 2):

# [[2 3]

# [6 7]]

>>> b = a[:2,1:3]

# A slice of an array is a view into the same data, so modifying it

# will modify the original array.

>>> print(a[0,1]) # Prints "2"

2

>>> b[0,0] = 77 # b[0, 0] is the same piece of data as a[0, 1]

>>> print(a[0,1]) # Prints "77"

77

“`

你可以同时使用整型和切片语法来访问数组。但是,这样做会产生一个比原数组低阶的新数组。需要注意的是,这里和MATLAB中的情况是不同的:

“`

>>> import numpy as np

>>> a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])

# Two ways of accessing the data in the middle row of the array.

# Mixing integer indexing with slices yields an array of lower rank,

# while using only slices yields an array of the same rank as the

# original array:

>>> row_r1 = a[1,:] # Rank 1 view of the second row of a

>>> row_r2 = a[1:2,:] # Rank 2 view of the second row of a

>>> print(row_r1,row_r1.shape)

[5 6 7 8] (4,)

>>> print(row_r2,row_r2.shape)

[[5 6 7 8]] (1, 4)

# We can make the same distinction when accessing columns of an array:

>>> col_r1 = a[:,1]

>>> col_r2 = a[:,1:2]

>>> print(col_r1,col_r1.shape)

[ 2 6 10] (3,)

>>> print(col_r2,col_r2.shape)

[[ 2]

[ 6]

[10]] (3, 1)

“`

整型数组访问:当我们使用切片语法访问数组时,得到的总是原数组的一个子集。整型数组访问允许我们利用其它数组的数据构建一个新的数组:

“`

>>> import numpy as np

>>> a = np.array([[1,2], [3, 4], [5, 6]])

# An example of integer array indexing.

# The returned array will have shape (3,) and

>>> print(a[[0, 1, 2], [0, 1, 0]]) #[0,0] [1,1] [2,0]

[1 4 5]

# The above example of integer array indexing is equivalent to this:

>>> prin([a[0, 0], a[1, 1], a[2, 0]]))

[1 4 5]

# When using integer array indexing, you can reuse the same

# element from the source array:

>>> print(a[[0, 0], [1, 1]]) #[0,1] [0,1]

[2 2]

# Equivalent to the previous integer array indexing example

>>> prin([a[0, 1], a[0, 1]]))

[2 2]

“`

整型数组访问语法还有个有用的技巧,可以用来选择或者更改矩阵中每行中的一个元素:

“`

>>> import numpy as np

>>> a = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])

>>> print(a)

[[ 1 2 3]

[ 4 5 6]

[ 7 8 9]

[10 11 12]]

>>> b = np.array([0,2,0,1])

>>> print(a[np.arange(4),b])

[ 1 6 7 11]

>>> a[np.arange(4),b] += 10

>>> print(a)

[[11 2 3]

[ 4 5 16]

[17 8 9]

[10 21 12]]

“`

布尔型数组访问:布尔型数组访问可以让你选择数组中任意元素。通常,这种访问方式用于选取数组中满足某些条件的元素,举例如下:

“`

>>> import numpy as np

>>> a = np.array([[1,2], [3, 4], [5, 6]])

>>> bool_idx = (a > 2)# Find the elements of a that are bigger than 2;

# this returns a numpy array of Booleans of the same

# shape as a, where each slot of bool_idx tells

# whether that element of a is > 2.

>>> print(bool_idx)

[[False False]

[ True True]

[ True True]]

# We use boolean array indexing to construct a rank 1 array

# consisting of the elements of a corresponding to the True values

# of bool_idx

>>> print(a[bool_idx])

[3 4 5 6]

# We can do all of the above in a single concise statement:

>>> print(a[a > 2])

[3 4 5 6]

“`

关于数组的访问详情请查看[Indexing](https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html)

相关推荐