Numpy快速入门教程(一):数组创建与数组访问

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

Numpy是Python中用于科学计算的核心库。它提供了高性能的多维数组对象,以及相关工具。(其中很多函数类似于matlab中的函数,如果有matlab基础建议看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))
'numpy.ndarray'>
>>> print(a.shape)
(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]]
>>> print(b.shape)
(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

访问数组
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:
>>> print(np.array([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
>>> print(np.array([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

你可能感兴趣的:(Numpy快速入门教程(一):数组创建与数组访问)