NumPy 特殊数组与通用函数

简介: NumPy 特殊数组与通用函数# 来源:NumPy Cookbook 2e ch6创建通用函数from __future__ import print_function import numpy a...

NumPy 特殊数组与通用函数

# 来源:NumPy Cookbook 2e ch6

创建通用函数

from __future__ import print_function 
import numpy as np

# 我们需要定义对单个元素操作的函数
def double(a):
    return 2 * a

# frompyfunc(或者 vectorize)
# 将其转换为对数组每个元素操作的函数
ufunc = np.frompyfunc(double, 1, 1) 
print("Result", ufunc(np.arange(4)))
# Result [0 2 4 6]

勾股数

from __future__ import print_function 
import numpy as np

# 勾股数是指满足 a ** 2 + b ** 2 == c ** 2 的三个数
# 我们使 a = m ** 2 - n ** 2,b = 2 * m * n
# c = m ** 2 + n ** 2,来寻找 a + b + c == 1000 的勾股数

# m 和 n 都取 0 ~ 32
m = np.arange(33) 
n = np.arange(33) 

# 计算 a,b 和 c
# outer 生成 a[i] op b[j] 为每个元素的矩阵
# 相当于 meshgrid 之后再逐元素操作
a = np.subtract.outer(m ** 2, n ** 2) 
b = 2 * np.multiply.outer(m, n) 
c = np.add.outer(m ** 2, n ** 2)

# 取符合我们条件的下标
# where 把布尔下标转换为位置下标
idx =  np.where((a + b + c) == 1000) 

# 验证并打印结果
np.testing.assert_equal(a[idx]**2 + b[idx]**2, c[idx]**2) 
print(a[idx], b[idx], c[idx]) 
# [375] [200] [425]

CharArray 字符串操作

# chararray 数组的元素只能是字符串
# 并且拥有许多字符串专用的方法
# 虽然我们可以为字符串创建通用函数
# 但是直接使用这些方法更省事

import urllib2 
import numpy as np 
import re

# 使用 urllib2 库下载网页
# 更推荐 requests 库
response = urllib2.urlopen('http://python.org/') 
html = response.read() 

# 替换掉所有标签
html = re.sub(r'<.*?>', '', html) 

# 创建仅仅包含该 HTML 的一维数组
# 并转为 chararray
carray = np.array(html).view(np.chararray) 

# expandtabs 将 TAB 转换为指定个数的空格
carray = carray.expandtabs(1) 
# splitlines 按换行符分割,会多一个维度
carray = carray.splitlines() 
print(carray)

创建屏蔽数组

from __future__ import print_function 
import numpy as np from scipy.misc 
import lena 
import matplotlib.pyplot as plt

# 加载 Lena 图像
lena = lena() 

# 掩码数组和图像形状一致,元素取 0 和 1 的随机数
random_mask = np.random.randint(0, 2, size=lena.shape)

# 绘制原始图像
plt.subplot(221) 
plt.title("Original") 
plt.imshow(lena) 
plt.axis('off')

# ma.array 创建屏蔽数组
# 如果 random_mask 中某个元素是 0
# masked_array 中就将其屏蔽
# 访问会返回 masked
# 但是转换回 np.array 时会恢复
masked_array = np.ma.array(lena, mask=random_mask)
print(masked_array) 

# 绘制掩码后的图像
plt.subplot(222) 
plt.title("Masked") 
plt.imshow(masked_array) 
plt.axis('off')

!

忽略负数以及极值

from __future__ import print_function 
import numpy as np 
from matplotlib.finance 
import quotes_historical_yahoo 
from datetime import date 
import matplotlib.pyplot as plt

def get_close(ticker):
    # 获取指定股票近一年的收盘价
    today = date.today()
    start = (today.year - 1, today.month, today.day)
    quotes = quotes_historical_yahoo(ticker, start, today)
    return np.array([q[4] for q in quotes])

# 获取 AAPL 一年的收盘价
close = get_close('AAPL')

triples = np.arange(0, len(close), 3) 
print("Triples", triples[:10], "...")
# Triples [ 0  3  6  9 12 15 18 21 24 27] ... 

# 创建等长的全 1 数组
signs = np.ones(len(close)) 
print("Signs", signs[:10], "...")
# Signs [ 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.] ... 

# sign 中每隔三个元素变为 -1
signs[triples] = -1 
print("Signs", signs[:10], "...")
# Signs [-1.  1.  1. -1.  1.  1. -1.  1.  1. -1.] ...

# ma.log 的作用是
# 如果元素小于等于 0,将其屏蔽
# 如果元素大于 0,取对数
ma_log = np.ma.log(close * signs) 
print("Masked logs", ma_log[:10], "...")
# Masked logs [-- 5.93655586575 5.95094223368 -- 5.97468290742 5.97510711452 -- 6.01674381162 5.97889061623 --] ...

dev = close.std() 
avg = close.mean() 
# 屏蔽 avg - dev 到 avg + dev 之外的元素
inside = np.ma.masked_outside(close, avg - dev, avg + dev) 
print("Inside", inside[:10], "...")
# Inside [-- -- -- -- -- -- 409.429675172    410.240597855 -- --] ...

# 绘制原始数据
plt.subplot(311) 
plt.title("Original") 
plt.plot(close)

# 绘制对数屏蔽后的数据
plt.subplot(312) 
plt.title("Log Masked") 
plt.plot(np.exp(ma_log))

# 绘制范围屏蔽后的数据
plt.subplot(313) 
plt.title("Not Extreme") 
plt.plot(inside)

plt.tight_layout() 
plt.show()

!

记录数组

# rec.array 是 array 的子类
# 可以通过元素的属性来访问元素
from __future__ import print_function 
import numpy as np from matplotlib.finance 
import quotes_historical_yahoo 
from datetime import date

tickers = ['MRK', 'T', 'VZ']

def get_close(ticker):
    # 获取指定股票近一年的收盘价
    today = date.today()
    start = (today.year - 1, today.month, today.day)
    quotes = quotes_historical_yahoo(ticker, start, today)
    return np.array([q[4] for q in quotes])

# 创建记录数组,来统计每个股票的代码、
# 标准分(标准差的倒数)、均值和得分
weights = np.recarray((len(tickers),), dtype=[('symbol', np.str_, 16),
    ('stdscore', float), ('mean', float), ('score', float)])

for i, ticker in enumerate(tickers):
    # 获取收盘价、计算对数收益
    close = get_close(ticker)
    logrets = np.diff(np.log(close))
    # 保存符号、对数收益的均值和标准分
    weights[i]['symbol'] = ticker
    weights[i]['mean'] = logrets.mean()   
    weights[i]['stdscore'] = 1/logrets.std()
    weights[i]['score'] = 0

# 每个股票的均值和标准分需要除以相应的总数
for key in ['mean', 'stdscore']:
    wsum = weights[key].sum()
    weights[key] = weights[key]/wsum

# 得分是标准分和均值的均值
weights['score'] = (weights['stdscore'] + weights['mean'])/2 weights['score'].sort()

# 打印每个股票的信息
for record in weights:
    print("%s,mean=%.4f,stdscore=%.4f,score=%.4f" % (record['symbol'], record['mean'], record['stdscore'], record['score']))
'''
MRK,mean=0.8185,stdscore=0.2938,score=0.2177 
T,mean=0.0927,stdscore=0.3427,score=0.2262 
VZ,mean=0.0888,stdscore=0.3636,score=0.5561 
'''
相关文章
|
5月前
|
存储 Java 数据处理
(numpy)Python做数据处理必备框架!(一):认识numpy;从概念层面开始学习ndarray数组:形状、数组转置、数值范围、矩阵...
Numpy是什么? numpy是Python中科学计算的基础包。 它是一个Python库,提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种方法,包括数学、逻辑、形状操作、排序、选择、I/0 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。 Numpy能做什么? numpy的部分功能如下: ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。 线性代数、随机数生成以及傅里叶变换功能。 用于集成由C、C++
485 1
|
5月前
|
Java 数据处理 索引
(numpy)Python做数据处理必备框架!(二):ndarray切片的使用与运算;常见的ndarray函数:平方根、正余弦、自然对数、指数、幂等运算;统计函数:方差、均值、极差;比较函数...
ndarray切片 索引从0开始 索引/切片类型 描述/用法 基本索引 通过整数索引直接访问元素。 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,strp)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符 &、|。
297 0
|
计算机视觉 Python
PIL图像转换为Numpy数组:技术与案例详解
本文介绍了如何将PIL图像转换为Numpy数组,以便利用Numpy进行数学运算和向量化操作。首先简要介绍了PIL和Numpy的基本功能,然后详细说明了转换过程,包括导入库、打开图像文件、使用`np.array()`或`np.asarray()`函数进行转换,并通过打印数组形状验证转换结果。最后,通过裁剪、旋转和缩放等案例展示了转换后的应用,以及如何将Numpy数组转换回PIL图像。此外,还介绍了处理base64编码图像的完整流程。
598 4
|
机器学习/深度学习 并行计算 大数据
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧2
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧
526 10
|
Python
Numpy学习笔记(四):如何将数组升维、降维和去重
本文介绍了如何使用NumPy库对数组进行升维、降维和去重操作。
297 1
|
Python
使用 NumPy 进行数组操作的示例
使用 NumPy 进行数组操作的示例
297 2
|
Python
Numpy学习笔记(五):np.concatenate函数和np.append函数用于数组拼接
NumPy库中的`np.concatenate`和`np.append`函数,它们分别用于沿指定轴拼接多个数组以及在指定轴上追加数组元素。
788 0
Numpy学习笔记(五):np.concatenate函数和np.append函数用于数组拼接
|
7月前
|
机器学习/深度学习 API 异构计算
JAX快速上手:从NumPy到GPU加速的Python高性能计算库入门教程
JAX是Google开发的高性能数值计算库,旨在解决NumPy在现代计算需求下的局限性。它不仅兼容NumPy的API,还引入了自动微分、GPU/TPU加速和即时编译(JIT)等关键功能,显著提升了计算效率。JAX适用于机器学习、科学模拟等需要大规模计算和梯度优化的场景,为Python在高性能计算领域开辟了新路径。
646 0
JAX快速上手:从NumPy到GPU加速的Python高性能计算库入门教程
|
7月前
|
存储 数据采集 数据处理
Pandas与NumPy:Python数据处理的双剑合璧
Pandas与NumPy是Python数据科学的核心工具。NumPy以高效的多维数组支持数值计算,适用于大规模矩阵运算;Pandas则提供灵活的DataFrame结构,擅长处理表格型数据与缺失值。二者在性能与功能上各具优势,协同构建现代数据分析的技术基石。
568 0
|
机器学习/深度学习 数据处理 Python
从NumPy到Pandas:轻松转换Python数值库与数据处理利器
从NumPy到Pandas:轻松转换Python数值库与数据处理利器
393 1