Python、Numpy 教程笔记

Python

简化写法:

for x in arr:

    if x < pivot:

        print(x)

=>

x for x in arr if x < pivot

列表

(循环)Loops: 你可以循环遍历列表的元素,如下所示:

animals = ['cat', 'dog', 'monkey']

for animal in animals:

    print(animal)

# Prints "cat", "dog", "monkey", each on its own line.

如果要访问循环体内每个元素的索引,请使用内置的 enumerate 函数:

animals = ['cat', 'dog', 'monkey']

for idx, animal in enumerate(animals):

    print('#%d: %s' % (idx + 1, animal))

# Prints "#1: cat", "#2: dog", "#3: monkey", each on its own line

列表推导式(List comprehensions): 编程时,我们经常想要将一种数据转换为另一种数据。 举个简单的例子,思考以下计算平方数的代码:

nums = [0, 1, 2, 3, 4]

squares = []

for x in nums:

    squares.append(x ** 2)

print(squares)  # Prints [0, 1, 4, 9, 16]

你可以使用 列表推导式 使这段代码更简单:

nums = [0, 1, 2, 3, 4]

squares = [x ** 2 for x in nums]

print(squares)  # Prints [0, 1, 4, 9, 16]

列表推导还可以包含条件:

nums = [0, 1, 2, 3, 4]

even_squares = [x ** 2 for x in nums if x % 2 == 0]

print(even_squares)  # Prints "[0, 4, 16]"

字典

(循环)Loops: 迭代词典中的键很容易:

d = {'person': 2, 'cat': 4, 'spider': 8}

for animal in d:

    legs = d[animal]

    print('A %s has %d legs' % (animal, legs))

# Prints "A person has 2 legs", "A cat has 4 legs", "A spider has 8 legs"

如果要访问键及其对应的值,请使用items方法:

d = {'person': 2, 'cat': 4, 'spider': 8}

for animal, legs in d.items():

    print('A %s has %d legs' % (animal, legs))

# Prints "A person has 2 legs", "A cat has 4 legs", "A spider has 8 legs"

字典推导式(Dictionary comprehensions): 类似于列表推导式,可以让你轻松构建词典数据类型。例如:

nums = [0, 1, 2, 3, 4]

even_num_to_square = {x: x ** 2 for x in nums if x % 2 == 0}

print(even_num_to_square)  # Prints "{0: 0, 2: 4, 4: 16}"

集合(Sets)

集合是不同元素的无序集合。举个简单的例子,请思考下面的代码:

animals = {'cat', 'dog'}

print('cat' in animals)  # Check if an element is in a set; prints "True"

print('fish' in animals)  # prints "False"

animals.add('fish')      # Add an element to a set

print('fish' in animals)  # Prints "True"

print(len(animals))      # Number of elements in a set; prints "3"

animals.add('cat')        # Adding an element that is already in the set does nothing

print(len(animals))      # Prints "3"

animals.remove('cat')    # Remove an element from a set

print(len(animals))      # Prints "2"

与往常一样,你想知道的关于集合的所有内容都可以在这篇文档中找到。

循环(Loops): 遍历集合的语法与遍历列表的语法相同;但是,由于集合是无序的,因此不能假设访问集合元素的顺序:

animals = {'cat', 'dog', 'fish'}

for idx, animal in enumerate(animals):

    print('#%d: %s' % (idx + 1, animal))

# Prints "#1: fish", "#2: dog", "#3: cat"

集合推导式(Set comprehensions): 就像列表和字典一样,我们可以很容易地使用集合理解来构造集合:

from math import sqrt

nums = {int(sqrt(x)) for x in range(30)}

print(nums)  # Prints "{0, 1, 2, 3, 4, 5}"

元组(Tuples)

元组是(不可变的)有序值列表。 元组在很多方面类似于列表; 其中一个最重要的区别是元组可以用作字典中的键和集合的元素,而列表则不能。 这是一个简单的例子:

d = {(x, x + 1): x for x in range(10)}  # Create a dictionary with tuple keys

t = (5, 6)        # Create a tuple

print(type(t))    # Prints "<class 'tuple'>"

print(d[t])      # Prints "5"

print(d[(1, 2)])  # Prints "1"

函数(Functions)

Python函数使用def关键字定义。例如:

def sign(x):

    if x > 0:

        return 'positive'

    elif x < 0:

        return 'negative'

    else:

        return 'zero'

for x in [-1, 0, 1]:

    print(sign(x))

# Prints "negative", "zero", "positive"

我们经常定义函数来获取可选的关键字参数,如下所示:

def hello(name, loud=False):

    if loud:

        print('HELLO, %s!' % name.upper())

    else:

        print('Hello, %s' % name)

hello('Bob') # Prints "Hello, Bob"

hello('Fred', loud=True)  # Prints "HELLO, FRED!"

类(Classes)

在Python中定义类的语法很简单:

class Greeter(object):

    # Constructor

    def __init__(self, name):

        self.name = name  # Create an instance variable

    # Instance method

    def greet(self, loud=False):

        if loud:

            print('HELLO, %s!' % self.name.upper())

        else:

            print('Hello, %s' % self.name)

g = Greeter('Fred')  # Construct an instance of the Greeter class

g.greet()            # Call an instance method; prints "Hello, Fred"

g.greet(loud=True)  # Call an instance method; prints "HELLO, FRED!"

Numpy

数组(Arrays)

numpy数组是一个值网格,所有类型都相同,并由非负整数元组索引。 维数是数组的排名; 数组的形状是一个整数元组,给出了每个维度的数组大小。

我们可以从嵌套的Python列表初始化numpy数组,并使用方括号访问元素:

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还提供了许多创建数组的函数:

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

数组索引

Numpy提供了几种索引数组的方法。

切片(Slicing): 与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"

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

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

整数索引与切片索引混合使用。 但是,这样做会产生比原始数组更低级别的数组。 请注意,这与MATLAB处理数组切片的方式完全不同:

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,)"

print(row_r2, row_r2.shape)  # Prints "[[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)  # 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]])

布尔数组索引: 布尔数组索引允许你选择数组的任意元素。通常,这种类型的索引用于选择满足某些条件的数组元素。下面是一个例子:

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

数据类型

每个numpy数组都是相同类型元素的网格。Numpy提供了一组可用于构造数组的大量数值数据类型。Numpy在创建数组时尝试猜测数据类型,但构造数组的函数通常还包含一个可选参数来显式指定数据类型。这是一个例子:

import numpy as np

x = np.array([1, 2])  # Let numpy choose the datatype

print(x.dtype)        # Prints "int64"

x = np.array([1.0, 2.0])  # Let numpy choose the datatype

print(x.dtype)            # Prints "float64"

x = np.array([1, 2], dtype=np.int32)  # Force a particular datatype

print(x.dtype)                        # Prints "int32"

数组中的数学

基本数学函数在数组上以元素方式运行,既可以作为运算符重载,也可以作为numpy模块中的函数:

import numpy as np

x = np.array([[1,2],[3,4]], dtype=np.float64)

y = np.array([[5,6],[7,8]], dtype=np.float64)

# Elementwise sum; both produce the array

# [[ 6.0  8.0]

#  [10.0 12.0]]

print(x + y)

print(np.add(x, y))

# Elementwise difference; both produce the array

# [[-4.0 -4.0]

#  [-4.0 -4.0]]

print(x - y)

print(np.subtract(x, y))

# Elementwise product; both produce the array

# [[ 5.0 12.0]

#  [21.0 32.0]]

print(x * y)

print(np.multiply(x, y))

# Elementwise division; both produce the array

# [[ 0.2        0.33333333]

#  [ 0.42857143  0.5      ]]

print(x / y)

print(np.divide(x, y))

# Elementwise square root; produces the array

# [[ 1.          1.41421356]

#  [ 1.73205081  2.        ]]

print(np.sqrt(x))

请注意,与MATLAB不同,*是元素乘法,而不是矩阵乘法。 我们使用dot函数来计算向量的内积,将向量乘以矩阵,并乘以矩阵。 dot既可以作为numpy模块中的函数,也可以作为数组对象的实例方法:

import numpy as np

x = np.array([[1,2],[3,4]])

y = np.array([[5,6],[7,8]])

v = np.array([9,10])

w = np.array([11, 12])

# Inner product of vectors; both produce 219

print(v.dot(w))

print(np.dot(v, w))

# Matrix / vector product; both produce the rank 1 array [29 67]

print(x.dot(v))

print(np.dot(x, v))

[[1,2],[3,4]]*[9,10]->1*9+2*10,3*9+4*10

# Matrix / matrix product; both produce the rank 2 array

# [[19 22]

#  [43 50]]

print(x.dot(y))

print(np.dot(x, y))

[[1,2],[3,4]]*[[5,6],[7,8]]->[1*5+2*7,1*6+2*8],[3*5+4*7,3*6+4*8]

Numpy为在数组上执行计算提供了许多有用的函数;其中最有用的函数之一是 SUM:

import numpy as np

x = np.array([[1,2],[3,4]])

print(np.sum(x))  # Compute sum of all elements; prints "10"

print(np.sum(x, axis=0))  # Compute sum of each column; prints "[4 6]"

print(np.sum(x, axis=1))  # Compute sum of each row; prints "[3 7]"

除了使用数组计算数学函数外,我们经常需要对数组中的数据进行整形或其他操作。这种操作的最简单的例子是转置一个矩阵;要转置一个矩阵,只需使用一个数组对象的T属性:

import numpy as np

x = np.array([[1,2], [3,4]])

print(x)    # Prints "[[1 2]

            #          [3 4]]"

print(x.T)  # Prints "[[1 3]

            #          [2 4]]"

# Note that taking the transpose of a rank 1 array does nothing:

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

print(v)    # Prints "[1 2 3]"

print(v.T)  # Prints "[1 2 3]"

tile函数位于python模块 numpy.lib.shape_base中,他的功能是重复某个数组。比如tile(A,n),功能是将数组A重复n次,构成一个新的数组

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 我自是笑别人底,却元来,当局者迷。 辛弃疾 《恋绣衾·无题》 我能行,我可以!一遍遍喝...
    画眉赵三儿阅读 285评论 0 0
  • 2017年3月19日 今天突然有这样一个念头——写考研日记 现在是22:16室友都上床了,聊天的打电话的扣手机的都...
    昵称总被占用的江江酱阅读 352评论 0 0
  • 【每日三问】我到底想要的是什么?我的目标是什么?我每天做的是否和想的一致? 1.伴读打卡 今日内容:课时4Birt...
    原味的夏天宝宝阅读 227评论 0 0
  • “大多数人的核心价值观是,拼命地向前,向前,再向前,因为前面就是历经磨难的天堂。 可是,停留下来就一定是地狱了吗?...
    花见川阅读 375评论 0 5