建议10:numpy使用基础

# -*- coding: utf-8 -*-
import numpy as np
#----------------------------------------
#-- 定义 ndarray
#--    先申明为python的序列,再转化为numpy的数组
#----------------------------------------

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

#获得数组大小
print ada.shape

#设置数组大小
ada.shape = 4,3

#当某个轴的元素为-1时,将根据数组元素的个数自动计算此轴的长度
ada.shape = 3,-1

#使用数组的reshape方法,可以创建一个改变了尺寸的新数组,原数组的shape保持不变
ada2 = ada.reshape((2,-1))

#数组ada和ada2其实共享数据存储内存区域,因此修改其中任意一个数组的元素都会同时修改另外一个数组的内容:
ada[2,1] = 100
print ada,ada2

#数组的元素类型可以通过dtype属性获得
np.array([[1, 2, 3, 4],[4, 5, 6, 7], [7, 8, 9, 10]], dtype=np.float)

#----------------------------------------
#-- 定义 ndarray
#--    采用NumPy提供了很多专门用来创建数组
#----------------------------------------

#arange函数类似于python的range函数,通过指定开始值、终值和步长来创建一维数组,注意数组不包括终值:
np.arange(0,1,0.1)

#linspace函数通过指定开始值、终值和元素个数来创建一维数组,可以通过endpoint关键字指定是否包括终值,缺省设置是包括终值:
np.linspace(0, 1, 12)

#logspace函数和linspace类似,不过它创建等比数列,下面的例子产生1(10^0)到100(10^2)、有20个元素的等比数列:
np.logspace(0, 2, 20)

#使用frombuffer, fromstring, fromfile等函数可以从字节序列创建数组
s = "abcdefgh"
np.fromstring(s, dtype=np.int8)
np.fromstring(s, dtype=np.int16)

#fromfunction函数的第一个参数为计算每个数组元素的函数,第二个参数为数组的大小(shape),因为它支持多维数组,所以第二个参数必须是一个序列
def func(i):
    return i%4+1
np.fromfunction(func, (10,))

#创建一个二维数组表示九九乘法表
def func2(i, j):
    return (i+1) * (j+1)
a = np.fromfunction(func2, (9,9))

#----------------------------------------
#-- 使用下标范围
#--    通过下标范围获取的新的数组是原始数组的一个视图。它与原始数组共享同一块数据空间:
#----------------------------------------

b = a[3:7] # 通过下标范围产生一个新的数组b,b和a共享同一块数据空间
b[2] = -10 # 将b的第2个元素修改为-10
a # a的第5个元素也被修改为10

#----------------------------------------
#-- 使用整数序列
#--    当使用整数序列对数组元素进行存取时,将使用整数序列中的每个元素作为下标,整数序列可以是列表或者数组。
#--        使用整数序列作为下标获得的数组不和原始数组共享数据空间。
#----------------------------------------
x = np.arange(10,1,-1)
x[[3, 3, 1, 8]] # 获取x中的下标为3, 3, 1, 8的4个元素,组成一个新的数组
b = x[np.array([3,3,-3,8])]  #下标可以是负数
x[[3,5,1]] = -1, -2, -3 # 整数序列下标也可以用来修改元素的值

#----------------------------------------
#-- 使用布尔数组
#--    当使用布尔数组b作为下标存取数组x中的元素时,将收集数组x中所有在数组b中对应下标为True的元素。
#--     使用布尔数组作为下标获得的数组不和原始数组共享数据空间,注意这种方式只对应于布尔数组,不能使用布尔列表。
#----------------------------------------
x = np.arange(5,0,-1)

# 布尔数组中下标为0,2的元素为True,因此获取x中下标为0,2的元素
x[np.array([True, False, True, False, False])]

# 如果是布尔列表,则把True当作1, False当作0,按照整数序列方式获取x中的元素
x[[True, False, True, False, False]]

# 布尔数组的长度不够时,不够的部分都当作False
x[np.array([True, False, True, True])]

# 布尔数组下标也可以用来修改元素
x[np.array([True, False, True, True])] = -1, -2, -3

# 产生一个长度为10,元素值为0-1的随机数的数组
x = np.random.rand(10)

# 数组x中的每个元素和0.5进行大小比较,得到一个布尔数组,True表示x中对应的值大于0.5
x>0.5

# 使用x>0.5返回的布尔数组收集x中的元素,因此得到的结果是x中所有大于0.5的元素的数组
x[x>0.5]

#----------------------------------------
#-- 多维数组
#--    多维数组的存取和一维数组类似,因为多维数组有多个轴,因此它的下标需要用多个值来表示,
#--    NumPy采用组元(tuple)作为数组的下标
#----------------------------------------
#多维数组同样也可以使用整数序列和布尔数组进行存取。

#----------------------------------------
#-- ufunc
#--    ufunc是universal function的缩写,它是一种能对数组的每个元素进行操作的函数。
#----------------------------------------

#linspace产生一个从0到2*PI的等距离的10个数
x = np.linspace(0, 2*np.pi, 10)
y = np.sin(x) #np.sin是一个ufunc函数,因此它对x中的每个元素求正弦值,然后将结果返回,并且赋值给y

#如果我们希望将sin函数所计算的结果直接覆盖到数组x上去的话,可以将要被覆盖的数组作为第二个参数传递给ufunc函数.
t = np.sin(x,x)

#add函数就是一个最常用的
a = np.arange(0,4)
b = np.arange(1,5)
np.add(a,b)

#add函数返回一个新的数组,此数组的每个元素都为两个参数数组的对应元素之和。
#它接受第3个参数指定计算结果所要写入的数组,如果指定的话,add函数就不再产生新的数组。
np.add(a,b,a)

#----------------------------------------
#-- ufunc
#      y = x1 + x2:            add(x1, x2 [, y]) 
#      y = x1 - x2:            subtract(x1, x2 [, y]) 
#      y = x1 * x2:            multiply (x1, x2 [, y]) 
#      y = x1 / x2:            divide(x1, x2 [, y]), 如果两个数组的元素为整数,那么用整数除法 
#      y = x1 / x2:            true divide (x1, x2 [, y]), 总是返回精确的商 
#      y = x1 // x2:           floor divide (x1, x2 [, y]), 总是对返回值取整 
#      y = -x:                 negative(x [,y]) 
#      y = x1**x2:             power(x1, x2 [, y]) 
#      y = x1 % x2:            remainder(x1, x2 [, y]), mod(x1, x2, [, y])  
#注意
#要运算的数组很大的话,会因为产生大量的中间结果而降低程序的运算效率。例如:假设a b c三个数组采用算式x=a*b+c计算
#t = a * b
#x = t + c
#del t
#分解的好处以减少一次内存分配。
#----------------------------------------
原文地址:https://www.cnblogs.com/tychyg/p/4936028.html