NumPy使用--中级练习
简述:人类早期驯服NumPy的第二篇来了,本篇内容中是用NumPy解决一些较为复杂的问题,直接上干货。
1.获取2022年6月的所有日期
import numpy as np
cx = np.arange('2022-06','2022-07',dtype = 'datetime64[D]')
print(cx)
复制
2.避免复制操作来计算((A+B)*(-A/2))
import numpy as np
A = np.ones(3)*1
B = np.ones(3)*2
print(np.multiply(np.add(A,B,out=B), np.negative(np.divide(A,2,out=A),out=A), out=A)) # 使用add()得到(A+B),使用divide()得到-A,使用negative()得到(-A/2),使用multiply()得到((A+B)*(-A/2))
复制
3.用五种方法抽取随机矩阵的整数部分
import numpy as np
cx = np.random.uniform(0,10,(10,10))
print(cx-cx%1)
print (np.floor(cx))
print (np.ceil(cx)-1)
print (cx.astype(int))
print (np.trunc(cx))
复制
4.创建一个5x5每行为0到4的矩阵
import numpy as np
print(np.tile(np.arange(5), (5, 1))) # tile()将np.arange(5)当作元素重新组成新矩阵
复制
5.使用生成器创建一个大小为10的数组
import numpy as np
def generate():
for x in range(10):
yield x
cx = np.fromiter(generate(),dtype=float)
print(cx)
复制
6.创建一个大小为10的数组,值为0到1之间,不包含0和1
import numpy as np
print(np.linspace(0, 1, 11, False)[1:]) # 先使用linspace()创建,再切片去掉首尾的0和1
复制
7.创建一个大小为10的数组并排序
import numpy as np
cx = np.random.random(10)
cx.sort() # 使用sort()从小到大排序
print(cx)
复制
8.对一个小数组用比np.sum快的方法求和
import numpy as np
print(np.add.reduce(np.arange(34))) # 使用add.reduce()
复制
9.比较两个随机数组是否相等
import numpy as np
cx = np.random.randint(0,3,4)
cl = np.random.randint(0,3,4)
print(np.allclose(cx,cl)) # 比较两个数组中的每个元素
print(np.array_equal(cx,cl)) # 比较两个整的数组
复制
10.创建一个不可变数组
import numpy as np
cx = np.ones(10)
cx.flags.writeable = False # 重置flags.writeable
复制
11.创建一个大小为10x2的矩阵来代表笛卡儿坐标,并转为极坐标
import numpy as np
cx = np.random.random((10,2))
X,Y = cx[:,0], cx[:,1] # 切分为两个
R = np.sqrt(X**2+Y**2) # 计算开放
T = np.arctan2(Y,X)
print(R)
print(T)
复制
12.创建一个大小为10的数组并把最大值设为0
import numpy as np
cx = np.random.random(10)
cx[cx.argmax()] = 0 # 找到最大值并修改为0
print(cx)
复制
13.创建一个xy的数组结构,包含[0,1]x[0,1]区域
import numpy as np
cx = np.zeros((5,5), [('x',float),('y',float)])
cx['x'], cx['y'] = np.meshgrid(np.linspace(0,1,5),
np.linspace(0,1,5))
print(cx)
复制
14.给定array X 和 Y, 构造柯西矩阵C(Cij = 1 /(xi-yj))
import numpy as np
cx = np.arange(4)
cl = cx + 0.5
cxl = 1.0 / np.subtract.outer(cx, cl)
print(np.linalg.det(cxl))
复制
15.显示机器能处理的数值的范围
import numpy as np
print(np.iinfo(np.int64))
print(np.iinfo(np.int32))
print(np.iinfo(np.uint16))
print(np.finfo(np.float64))
print(np.finfo(np.float16))
复制
16.显示array中所有的值
import numpy as np
np.set_printoptions(threshold=1) #可以用...代替中间值
Z = np.zeros((26,26))
print(Z)
复制
17.如何在向量中找到指定范围的最近值
import numpy as np
cx = np.arange(100)
cl = np.random.uniform(0,100)
index = (np.abs(cx-cl)).argmin() # 找到差值最小的下标
print(cx[index])
复制
18.构建一个代表位置 (x,y) 和 颜色 (r,g,b)的矩阵
import numpy as np
mydtype = np.dtype([('xy',[('x', np.int64), ('y', np.int64)]), ('color',[('r', np.int16), ('g', np.int16), ('b', np.int16)])])
print(np.ones((3, 2), mydtype))
复制
19.用一个100*2的随机向量来表示坐标,计算点到点的距离
import numpy as np
cx = np.random.random((100,2))
X,Y = np.atleast_2d(cx[:,0], cx[:,1]) # 切分矩阵形成向量
cl = np.sqrt( (X-X.T)**2 + (Y-Y.T)**2) # 计算距离
print(cl)
复制
20.如何把一个浮点数组(int32)直接转换为整数(int32)
import numpy as np
cx = np.random.rand(20)*10
print(cx.astype(np.int32)) # 使用astype()直接转
复制
21.从文本文件中读取数据
import numpy as np
from io import StringIO
s = StringIO(""" , , 3, 4, 5\n
6, , , 7, 8\n
, , 9,10,11\n""") # 模拟.txt文件
print(np.genfromtxt(s,delimiter=','))
复制
22.矩阵的坐标
import numpy as np
cx = np.arange(9).reshape(3,3)
for index in np.ndindex(cx.shape): # 循环获取坐标和下标
print (index, cx[index])
复制
23.生成二维高斯分布
import numpy as np
X,Y = np.meshgrid(np.linspace(-1,1,10),np.linspace(-1,1,10))
D =np.sqrt((X*X+Y*Y))
sigma, mu = 1.0, 0.0
G = np.exp(-((D-mu)**2 / (2.0 * sigma**2)))
复制
24.将元素P随机的放入二维数组中
import numpy as np
n = 6
p = 34
cx = np.zeros((n,n))
np.put(cx, np.random.choice(range(n*n), p, replace=False),1)
print (cx)
复制
25.矩阵的第一行减去算术平均值
import numpy as np
X = np.random.rand(3, 4)
Y = X - X.mean(axis=1, keepdims=True) # 实现减去平均值
print(Y)
复制
26.把数组按第n列排序
import numpy as np
cx = np.random.randint(0, 9, (3, 4))
print(cx)
print(np.sort(cx, axis=0)) # 全部都排序
print(np.argsort(cx, axis=0)) # 给出的是索引顺序
print(cx[cx[:, 1].argsort()]) # 按第二列排序
复制
27.如何判断一个二维数组有全为0的列
import numpy as np
cx = np.random.randint(0,3,(3,4))
print ((~cx.any(axis=0)).any()) # axis=0锁定每一列,any() 函数用于判断是否全部是0
复制
28.从数组中找出给定值的最近似值
import numpy as np
cx = np.random.uniform(0,1,10)
cl = 0.5
cxl = cx.flat[np.abs(cx - cl).argmin()] # 利用差值找到最近似的元素
print(cxl)
复制
29.使用迭代器计算1x3和3x1的数组的和
import numpy as np
A = np.arange(3).reshape(3, 1)
B = np.arange(3).reshape(1, 3)
cx = np.nditer([A, B, None]) # 多维数组的迭代
for x, y, z in cx:
z[...] = x + y
print(cx.operands[2])
复制
30.创建一个有名字的数组类
import numpy as np
class NamedArray(np.ndarray):
def __new__(cls, array, name="no name"):
obj = np.asarray(array).view(cls)
obj.name = name
return obj
def __array_finalize__(self, obj):
if obj is None: return
self.info = getattr(obj, 'name', "no name")
cx = NamedArray(np.arange(34), "range_34")
print(cx.name)
复制
31.对一个给定数组,如何按第二个数组表示的索引位置将对应的元素+1,注意重复的位置要重复加1
import numpy as np
cx = np.ones(10)
cl = np.random.randint(0,len(cx),10)
np.add.at(cx, cl, 1)
print(cx)
复制
32.如何基于索引列表I,将向量X的各元素累加到数组F上
import numpy as np
cx = [1,2,3,4,5,6]
cl = [8,9,4,5,6,7]
cxl = np.bincount(cl,cx)
print(cxl)
复制
33.对一个(w,h,3)表示的图像,如何计算不重复的颜色
import numpy as np
w,h = 16,16
cx = np.random.randint(0,2,(h,w,3)).astype(np.ubyte)
cl = cx[...,0]*256*256 + cx[...,1]*256 +cx[...,2]
print(np.unique(cx))
复制
总结:以上是NumPy的中级使用的问题和解决方法,本次遇到的问题中会需要多种函数组合使用,未知函数可使用np.info()
查看使用方法和功能,欢迎大家尝试或者补充更好的方法。高级篇正在准备中,还请期待~