Python Numpy Tutorial

翻译自:http://cs231n.github.io/python-numpy-tutorial/

Numpy

Numpy是python科学计算的一个核心库。它提供了高性能多维数据对象以及操作这些数组的工具。

Arrays

numpy数据是一个相同数据类型的值网格,用一个非负整数的元组来索引。
rank:维数
shape:是一个整数元组,元素表示每一维的大小

我们可以用python的lists初始化一个numpy数组,用方括号取元素。注意shape的输出,如:

import numpy as np
a = np.array([1,2,3])     #Create a rank 1 array
print(type(a))                #Prints "<class 'numpy.ndarray'>"
print(a.shape)              #Prints "(3,)"
print(a[0], a[1], a[2])     # Prints "1 2 3"
a[0] = 5                        # Change an element of the array
print(a)                         # Prints "[5, 2, 3]"

b = np.array([[1,2,3],[4,5,6]])    # Create a rank 2 array
print(b.shape)                           # Prints "(2, 3)"
print(b[0, 0], b[0, 1], b[1, 0])      # Prints "1 2 4"

Numpy也提供了很多创建数组的函数
如:np.zeros(shape),np.ones(shape)

import numpy as np

a = np.zeros((2,2))   # Create an array of all zeros
print(a)              # Prints "[[ 0.  0.]
                      #          [ 0.  0.]]"

b = np.ones((1,2))    # Create an array of all ones
print(b)              # Prints "[[ 1.  1.]]"

c = np.full((2,2), 7)  # Create a constant array
print(c)               # Prints "[[ 7.  7.]
                       #          [ 7.  7.]]"

d = np.eye(2)         # Create a 2x2 identity matrix
print(d)              # Prints "[[ 1.  0.]
                      #          [ 0.  1.]]"

e = np.random.random((2,2))  # Create an array filled with random values
print(e)                     # Might print "[[ 0.91940167  0.08143941]
                             #               [ 0.68744134  0.87236687]]"

可在此链接中找到更多的创建数组的方法:https://docs.scipy.org/doc/numpy/user/basics.creation.html#arrays-creation

Array indexing

numpy提供了索引数组的几种方式

切片:类似于Python lists,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"
b[0, 0] = 77     # b[0, 0] is the same piece of data as a[0, 1]
print(a[0, 1])   # Prints "77"

也可以将切片索引和整数索引整合在一起。然而,这样做的话将会产生一个更低rank的数组。示例如下:

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]])

# 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)  # Prints "[5 6 7 8] (4,)" ,rank比原始数组低
print(row_r2, row_r2.shape)  # Prints "[[5 6 7 8]] (1, 4)",rank和原始数组一样

# 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)  # Prints "[ 2  6 10] (3,)"
print(col_r2, col_r2.shape)  # Prints "[[ 2]
                             #          [ 6]
                             #          [10]] (3, 1)"

整数数组索引
当你使用切片来索引numpy数组时,结果数组是原始数组的一个子数组。与之相反,整数数组索引允许你构建一个全新的数组,通过来自其他数组的元素。示例如下:

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]])  # Prints "[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]]))  # Prints "[1 4 5]"

# When using integer array indexing, you can reuse the same
# element from the source array:
print(a[[0, 0], [1, 1]])  # Prints "[2 2]"

# Equivalent to the previous integer array indexing example
print(np.array([a[0, 1], a[0, 1]]))  # Prints "[2 2]"

整数索引的一个有用的技巧是从矩阵每一行选择或者改变一个元素

import numpy as np

# Create a new array from which we will select elements
a = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])

print(a)  # prints "array([[ 1,  2,  3],
          #                [ 4,  5,  6],
          #                [ 7,  8,  9],
          #                [10, 11, 12]])"

# Create an array of indices
b = np.array([0, 2, 0, 1])

# Select one element from each row of a using the indices in b
print(a[np.arange(4), b])  # Prints "[ 1  6  7 11]"

# Mutate one element from each row of a using the indices in b
a[np.arange(4), b] += 10

print(a)  # prints "array([[11,  2,  3],
          #                [ 4,  5, 16],
          #                [17,  8,  9],
          #                [10, 21, 12]])

boolean数组索引
一般用来选择满足情况的元素

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)      # Prints "[[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])  # Prints "[3 4 5 6]"

# We can do all of the above in a single concise statement:
print(a[a > 2])     # Prints "[3 4 5 6]"

猜你喜欢

转载自blog.csdn.net/qq_42278791/article/details/90648850